web-dev-qa-db-ja.com

Javaで配列要素を揮発性として宣言するにはどうすればよいですか?

Javaで配列要素volatileを宣言する方法はありますか?つまり.

volatile int[] a = new int[10];

配列参照volatileを宣言しますが、配列要素(例:a[1])まだ揮発性ではありません。だから私は次のようなものを探しています

volatile int[] a = new volatile int[10];

しかし、それはそのようには機能しません。それは可能ですか?

35
Joonas Pulakka

AtomicIntegerArrayまたはAtomicLongArrayまたはAtomicReferenceArrayを使用します

AtomicIntegerArrayクラスは、クラスのget()およびset()メソッドを介して、個々のフィールドに揮発性セマンティクスでアクセスできるint配列を実装します。あるスレッドからarr.set(x, y)を呼び出すと、arr.get(x)を呼び出す別のスレッドが値yを読み取ることが保証されます(別の値が位置xに読み取られるまで)。

見る:

30
uthark

いいえ、配列要素を揮発性にすることはできません。 http://jeremymanson.blogspot.com/2009/06/volatile-arrays-in-Java.html も参照してください。

6
Tim Jansen

これはどう:

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;

セルはコンテンツも揮発性にします。また、セルを事前に割り当てた後でのみ、新しいアレイを揮発性アレイに割り当てます...セルの余分なメモリのトレードオフがありますが、管理可能です

0
gotch4