私は少し混乱しています...何の操作アトミック操作
は、それはすべてlongとdoubleを除く複数のスレッドからの書き込み\読み出しがアトミック操作であり、長いだけとダブルで揮発性を使用する必要がありますというのは本当でしょうか?
私は少し混乱しています...何の操作アトミック操作
は、それはすべてlongとdoubleを除く複数のスレッドからの書き込み\読み出しがアトミック操作であり、長いだけとダブルで揮発性を使用する必要がありますというのは本当でしょうか?
あなたはJLSのthis sectionを参照しているようですね。 double
とlong
を除くすべてのプリミティブ型で、実際にその変数に書き込まれた値はすべてとなります。 (double
とlong
の場合、最初の4バイトは1つのスレッドによって書き込まれ、最後の4バイトは別のスレッドによって書き込まれる可能性があります)。と同じの値は必ずしも表示されません。変数がvolatile
と表示されていない限り、同じ時間です。それは、読み取りおよび書き込みを行いいる、x = x + 3
をだし、読み取りと書き込みの間x
への書き込みがあるかもしれないので、でもvolatile
を使用して
、x += 3
は、アトミックではありません。だから私たちはAtomicInteger
のようなものを持っていて、他のユーティリティはjava.util.concurrent
です。
これは正しいとは言えません。
アトミック操作は、別のスレッドが完了するまで、すべてのスレッドがリソースにアクセスするのを強制的に待機させる操作です。なぜ他のデータ型がアトミックであるのか、他のデータ型はアトミックでないのか分かりません。
アトミックとスレッドセーフを混同しないでください。長い書込みと2回書込みは、それぞれ2つの別々の32ビット・ストアであるため、アトミックではありません。非long/doubleフィールドの格納とロードは、コンパウンドではないと仮定すると完全にアトミックです(例えばi++
)。
アトミック(atomic)私は、多くのスレッドが同じフィールドに異なるオブジェクトを書き込んだ結果、文字化けしたオブジェクトを読み取らないことを意味します。 Java Concurrency In Practice 3.1.2
から
アウト・オブ・シン・アイレ安全性:スレッドが 同期せずに変数を読み取ると、それは古い値が表示されることがありますが、少なくともそれは 値を見ていますいくつかのスレッドによって実際にそこに置かれました ランダム値。これは、揮発性ではない64ビット長と 倍を除くすべての変数に当てはまります。 JVMは、64ビットの をアトミックではない2つの別々の32ビット操作として扱うことができます。
揮発性
、それは他のスレッドがすぐに更新された値を参照してください(とそれが出て最適化することができないこと)ができることを意味し、単にアトミック
を値を書き込む以外の意味を持っていますが、ソースを持っていますかこのため? – paislee