0

以下は、私の Java コードの主な操作の 1 つです。

 AtomicDoubleArray array1 = new AtomicDoubleArray(25);

 for(int i =0 ; i< array1.size(); i++){
     double a = array1.get(i)*0.001;
     double b = a+ array1.get(i);
     array1.set(b);
 }

上記のコードはスレッドセーフですか? そうでない場合、上記のコードをスレッド セーフにすることはできますか?要素の読み取り中にロックを維持するのではなく、各コンポーネントの値の設定中にロックを維持したいと考えています。これは、複数のスレッドが array1 のさまざまなコンポーネントを設定できることを意味します。

4

2 に答える 2

3

上記のコードはスレッドセーフですか?

それは、スレッドセーフで何を意味するかによって異なります。個々の get() および set() 操作はスレッドセーフである必要がありますが、複数のスレッドがこのメソッドを同時に呼び出す可能性があるため、最初のスレッドが反復を完了する前に、個々の配列エントリが 2 番目のスレッドによって再割り当てされる可能性があります。共通のオブジェクト(配列または他の専用ロックオブジェクトのいずれか)で同期する以外に、それについてできることは何もありません

要素の読み取り中にロックを維持したいのではなく、各コンポーネントの値の設定中にロックを維持したいと考えています。これは、多くのスレッドが array1 のさまざまなコンポーネントを設定できることを意味します。

私がこの権利を理解していれば、この部分を除いて、追加のロックなしでコードをそのまま使用できます (上記を参照)。

 array1.set(b);

読む必要があるもの:

 array1.set(i, b);
于 2012-08-05T12:59:26.930 に答える