2

参照の場所。http://en.wikipedia.org/wiki/Locality_of_reference。したがって、小さな int 配列を反復するのと同じように、linkedList を反復するよりも高速になります。配列が連続しているため、すべての配列が CPU キャッシュに収まり、キャッシュ ミスが少なくなります。

しかし、単純な int 配列と volatile 配列の比較が必要です。私の知る限り、揮発性配列を反復すると、毎回揮発性読み取りが発生し、一部のシステムでは読み取りごとにキャッシュが更新される可能性があります。

int[] arr; // assume here i have declared and initialized it.
int sum = 0;
for(int i=0;i<arr.length;i++){
    sum = sum + arr[i];
}

揮発性カウンターパート

volatile int[] arr; // assume here i have declared and initialized it.
int sum = 0;
for(int i=0;i<arr.length;i++){
    sum = sum + arr[i]; // volatile read everytime
}

したがって、それらは同じであるか、コンパイラーはすべての揮発性読み取りを単一の揮発性読み取りにします(コンパイラーの最適化)

4

2 に答える 2

3

配列への揮発性アクセスが必要な場合は、AtomicIntegerArrayを使用できます。これは配列をラップしますintが、スレッドセーフなセマンティクスを提供します。

AtomicIntegerArray array = new AtomicIntegerArray(100);
array.addAndGet(1);
array.lazySet(10, 123);
int n = array.get(5); // volatile get
array.set(9, 333); // volatile set.
于 2013-10-21T17:08:51.873 に答える
0

Scientist のコードをわずかに改善しただけです。実際には追加の volatile ブール値フラグは必要ありません。次のようにするだけで済みます。

volatile int[] array = ...;

void write(int index, int value){
    array[index]=value;
    array = array; // explicit volatile write
}

int read(int index){
    return array[index]; // implicit volatile read
}

主な変更点は、読み取りのために volatile 変数を追加で読み取る必要がないことです。これは、配列の i 番目の要素にアクセスするには、配列への volatile 参照を読み取る必要があるためです (JIT/コンパイラが実際に行うかどうかは別のことですが、ただし、同じ保証を提供する必要があります)。とにかく、それはまさにあなたが書くコードであるため、それは非常に素晴らしいことです。悲しいことに、それは配列への書き込みには機能しないため、この非常に醜い自己割り当てを行う必要があります。

とはいえ、AtomicIntegerArray クラスはこれと同じくらい効率的で (少なくともそう願っています)、すべてを明示的にします。

于 2013-10-22T00:53:48.803 に答える