有什么清洁和有效的方式来种植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
领域,扩展它,而新的数组传递到原子* 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
的构造函数中,并且非常难看。
有没有更快/更干净的方法来做到这一点?
相关:http://stackoverflow.com/questions/9408112/get-the-array-from-an-atomiclongarray –
你可以通过链接从旧到新的数组,以便消费者可以遍历。有关此想法的示例,请参阅JCTools的[MpscChunkedArrayQueue](https://github.com/JCTools/JCTools/blob/master/jctools-core/src/main/java/org/jctools/queues/MpscChunkedArrayQueue.java)。 –
@BenManes是的,我想到了这个想法,但是由于我们需要在链接中包装数组,因此内存使用量要高得多,而且逻辑稍微复杂一点,因为我们需要维护一个近似的尾指针。正如事情正在一个单一的阵列正常工作,但我想尽可能多的表现这种方法尽可能。 –