Javaで配列要素volatile
を宣言する方法はありますか?つまり.
volatile int[] a = new int[10];
配列参照volatile
を宣言しますが、配列要素(例:a[1]
)まだ揮発性ではありません。だから私は次のようなものを探しています
volatile int[] a = new volatile int[10];
しかし、それはそのようには機能しません。それは可能ですか?
AtomicIntegerArray
またはAtomicLongArray
またはAtomicReferenceArray
を使用します
AtomicIntegerArray
クラスは、クラスのget()
およびset()
メソッドを介して、個々のフィールドに揮発性セマンティクスでアクセスできるint配列を実装します。あるスレッドからarr.set(x, y)
を呼び出すと、arr.get(x)
を呼び出す別のスレッドが値yを読み取ることが保証されます(別の値が位置xに読み取られるまで)。
見る:
いいえ、配列要素を揮発性にすることはできません。 http://jeremymanson.blogspot.com/2009/06/volatile-arrays-in-Java.html も参照してください。
これはどう:
static class Cell<T> {
volatile T elem;
}
private Cell<T>[] alloc(int size){
Cell<T>[] cells = (Cell<T>[]) (new Cell[size]);
return cells;
}
volatile Cell<T>[] arr;
Cell<T>[] newarr = alloc(16);
for (int i = 0; i < newarr.length; i++) {
newarr[i] = new Cell<>();
}
arr = newarr;
セルはコンテンツも揮発性にします。また、セルを事前に割り当てた後でのみ、新しいアレイを揮発性アレイに割り当てます...セルの余分なメモリのトレードオフがありますが、管理可能です