有什麼清潔和有效的方式來種植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是的,我想到了這個想法,但是由於我們需要在鏈接中包裝數組,因此內存使用量要高得多,而且邏輯稍微複雜一點,因爲我們需要維護一個近似的尾指針。正如事情正在一個單一的陣列正常工作,但我想盡可能多的表現這種方法儘可能。 –