Atomic(Double|Integer|Long|Reference)Array
をクリーンで効率的に成長させる方法はありますか?私の特別なケースでは、コピー中の同時書き込みはありません。新しいものを作成して、ループ内の宛先アレイにソース配列をコピーするための1つの明らかな方法:このコードを原子配列を効率的に成長させる
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
クラスの2つのコピーを作成します.1つはArrays.copy
に、もう1つは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はい私はその考えを考えましたが、リンクで配列をラップする必要があるため、メモリの使用量はかなり高くなります。ロジックは、おおよそのテールポインタを維持する必要があるため、少し複雑です。 1つの配列でうまく動作しているように、私はできるだけ多くのパフォーマンスを得たいと考えています。 –