1

変数に対して読み取り操作のみを行っている場合は、揮発性を使用する必要があります。これは、前のスレッドが 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;
        }
}
4

4 に答える 4

2

これは、AtomicBoolean を使用する必要がある場合ですか?

はい、そうです。

はいの場合、同期を使用してこれを処理できないのはなぜですか?

機能的には同等ですが、AtomicBoolean はロックを使用しないため、適度な競合下でより効率的になります。この他の質問を参照してください-それは AtomicInteger を調べますが、結論は AromicBoolean にも直接適用できます。

于 2013-06-17T18:13:17.953 に答える
0

はい、これは AtomicBoolean を使用したい場合です。あなたが言及した種類の同期を(自分で行うのではなく)達成するための非常に優れた安全な方法であり、はるかに高速です。代わりに volatile ブール値を使用した場合との比較については、このリンクも参照してください。

于 2015-01-15T01:48:19.610 に答える