是否有任何干净有效的方法来培养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.arraycopy
或Arrays.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;的构造函数,非常难看。
有更快/更清洁的方法吗?
答案 0 :(得分:1)
我担心我会让你失望:如何批量复制Atomic*Array
。
查看javadoc,没有任何方法可以一次为您提供多个元素。甚至不使用可以传递给AtomicIntegerArray
构造函数的原始数组也会有所帮助 - 该类在内部进行复制。
查看AtomicIntegerArray
源代码,使用反射可能有效 - 该类不会对array
字段执行任何特殊操作。不过,我不会。它不仅是美国的,而且反射会给你一些你试图避免的性能损失。
如果您的目标是增加数组,可能需要查看LinkedBlockingQueue或CopyOnWriteArrayList,具体取决于您的使用情况。
我已经跑了几次这个问题,但我们总是找到一种没有Atomic*Array
的方法。