有效地增长原子阵列

时间:2016-04-27 19:27:51

标签: java performance concurrency java.util.concurrent

是否有任何干净有效的方法来培养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 * Array构造函数:

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&#39;的构造函数,非常难看。

有更快/更清洁的方法吗?

1 个答案:

答案 0 :(得分:1)

我担心我会让你失望:如何批量复制Atomic*Array

查看javadoc,没有任何方法可以一次为您提供多个元素。甚至不使用可以传递给AtomicIntegerArray构造函数的原始数组也会有所帮助 - 该类在内部进行复制。

查看AtomicIntegerArray源代码,使用反射可能有效 - 该类不会对array字段执行任何特殊操作。不过,我不会。它不仅是美国的,而且反射会给你一些你试图避免的性能损失。

如果您的目标是增加数组,可能需要查看LinkedBlockingQueueCopyOnWriteArrayList,具体取决于您的使用情况。

我已经跑了几次这个问题,但我们总是找到一种没有Atomic*Array的方法。