有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java高效增长的原子阵列

有没有干净有效的方法来种植Atomic(Double|Integer|Long|Reference)Array?在我的特殊情况下,复制期间没有并发写入。创建新阵列并在循环中将源阵列复制到目标阵列的一种显而易见的方法:

Atomic*Array dest = new Atomic*Array(newSize);
for (int i = 0, len = src.length(); i < len; ++i)
    dest.set(i, src.get(i));

这段代码可能比System.arraycopyArrays.copy类型的函数慢得多,而且有点冗长

我也可以使用反射来获取源的array字段,扩展它,并将新数组传递到Atomic*数组构造函数中:

try {
    Field arrayField = Atomic*Array.class.getDeclaredField("array");
    arrayField.setAccessible(true);
    ArrayType srcArray = (ArrayType)arrayField.get(src);
    Atomic*Array dest = new Atomic*Array(Arrays.copyOf(srcArray, newLength));
} catch (IllegalAccessException | NoSuchFieldException e) {
    throw new AssertionError(e);
}

但是这段代码也有问题:它依赖于Atomic*Array类的实现,制作了两个数组副本-一个在Arrays.copy中,一个在dest的构造函数中,非常难看

有没有更快/更干净的方法


共 (1) 个答案

  1. # 1 楼答案

    我担心我会让你失望:没有办法批量复制Atomic*Array

    看看javadoc,没有一种方法一次只能提供一个元素。即使不使用可以传递给AtomicIntegerArray构造函数的原始数组也会有所帮助-该类在内部创建一个副本

    查看AtomicIntegerArray源代码,使用反射可以工作-该类对array字段没有任何特殊处理。但我不会。不仅是usafe,而且反射会给您带来一些您试图避免的性能损失

    如果您的目标是增加数组,那么您可能希望签出LinkedBlockingQueueCopyOnWriteArrayList,这取决于您的用例

    我已经遇到过几次这个问题,我们总能找到一种最终没有Atomic*Array的方法