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.arraycopy
或Arrays.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 楼答案
我担心我会让你失望:没有办法批量复制
Atomic*Array
看看javadoc,没有一种方法一次只能提供一个元素。即使不使用可以传递给
AtomicIntegerArray
构造函数的原始数组也会有所帮助-该类在内部创建一个副本查看
AtomicIntegerArray
源代码,使用反射可以工作-该类对array
字段没有任何特殊处理。但我不会。不仅是usafe,而且反射会给您带来一些您试图避免的性能损失如果您的目标是增加数组,那么您可能希望签出LinkedBlockingQueue或CopyOnWriteArrayList,这取决于您的用例
我已经遇到过几次这个问题,我们总能找到一种最终没有
Atomic*Array
的方法