4

ダーティな値の問題なしに、さまざまなスレッドから読み書きできるフラグが必要です。静的な揮発性にするだけで十分ですか?

static volatile boolean flag;
4

2 に答える 2

5

いいえ、次のようなアクションが必要な場合、これだけでは不十分です。

volatile int v = 0;

Thread 1:
v++;

Thread 2:
v--;

理想的には、上記のコードを実行するときに v=0 が必要ですが、これが実際に起こっていることです (複合アクション):

Thread 1:
r1 = v;
r2 = r1 + 1;
v = r2;

Thread 2:
r3 = v;
r4 = r3 - 1;
v = r4;

そして、両方のスレッドがそれぞれ 1 と -1 の値を与えます。出典: 揮発性は原子を意味するものではありません!

マルチスレッドのシナリオで一貫した結果を保証する必要がある場合は、@Eng.Fouad が指摘したように、Java で Atomic クラスを使用する必要があります。

ブール値の場合も、volatile を使用するよりも、AtomicBoolean クラスからの比較と設定が役立ちます。

于 2012-11-14T08:24:38.597 に答える
3

魅力的ですが、そのようなコードは避けてください。

単純なシナリオでは、boolean数学演算が許可されていないため、これは機能しているようです (値を割り当てることしかできません)。しかし、単純なケースはめったにありません。最終的には、必要になります

if(flag) {
    flag = false;
}

このコードは時々壊れます。したがって、他の回答で示唆されているように、java.util.concurrent.Atomic* クラスを使用する必要があります。

于 2012-11-14T08:42:25.067 に答える