変数に対して読み取り操作のみを行っている場合は、揮発性を使用する必要があります。これは、前のスレッドが CPU を失い、同期ブロックを終了した場合でも、1 つのスレッドによって更新された値が他のスレッドに表示されるためです。あれは正しいですか?アトミックプリミティブは、アトミック動作を使用する必要がある場合に使用されます。例えば -
if (volatileBoolean) {
volatileBoolean = !volatileBoolean;
}
volatileBoolean の値が true であるとしましょう。1 つのスレッドは volatileBoolean を true としてチェックし、if ブロックに入り、2 番目のスレッドは volatileBoolean の値を true と見なし、if ブロックにも入ります。ここで、最初のスレッドが偽の値 (!volatileBoolean) を volatileBoolean 変数に割り当て、CPU を失い、if ブロックを終了するとします。2 番目のスレッドは volatileBoolean を false と見なし、true に割り当てます。
これは、AtomicBoolean を使用する必要がある場合ですか? はいの場合、同期を使用してこれを処理できないのはなぜですか?
synchronized(this){
if (volatileBoolean) {
volatileBoolean = !volatileBoolean;
}
}