下の行のどこかで読みました。
Java の volatile キーワードはアトミックを意味するものではありません。volatile を宣言すると
++
操作がアトミックになるという誤解がよくありますが、操作をアトミックにするには、Java のメソッドまたはブロックを使用して排他的アクセスを確保する必要がありますsynchronized
。
では、2 つのスレッドがvolatile
同時にプリミティブ変数を攻撃すると何が起こるでしょうか?
これは、ロックを取得した人が最初に値を設定することを意味しますか。そして、その間に、最初のスレッドが値を変更している間に他のスレッドが起動して古い値を読み取った場合、新しいスレッドは古い値を読み取るのではないですか?
Atomic キーワードと volatile キーワードの違いは何ですか?
ベストアンサー1
キーワードの効果は、volatile
その変数に対する個々の読み取りまたは書き込み操作がすべてのスレッドに対してアトミックに表示されるようになることです。
ただし、1回の読み取りと1回の書き込みを行うi++
と同等の など、 1回以上の読み取り/書き込みを必要とする操作は、i = i + 1
ないi
読み取りと書き込みの間に別のスレッドが書き込む可能性があるため、アトミックです。
やなどのクラスAtomic
は、の増分など、より多様な操作をアトミックに提供します。AtomicInteger
AtomicReference
AtomicInteger