1

この非常に単純な例を見てください:

volatile int globalVar = 1;

私のスレッド:

if (globalVar > 0) {
    globalVar--;
}

ここで、変数を volatile にするだけで競合状態を回避し、このスレッドを安全にすることができるかどうかを判断する必要があります。

インクリメントとデクリメントがそうではないことは知っていますが、前の条件のために、それが異なるかどうかはわかりません。

次の順序で実行できるため、まだ安全ではないと思います。

スレッド A は状態をチェックします。スレッド B は状態をチェックします。スレッド A が増加します。スレッド B が増加します。

私は正しいですか?

4

4 に答える 4

0

volatile は原子性を保証しません。同期ブロックを追加するだけです。

synchronized(this)
{
 if (globalVar > 0) {
   globalVar--;
 }
}
于 2013-07-18T08:26:27.350 に答える