2012-04-02 20 views
6

私は少し混乱しています...何の操作アトミック操作

は、それはすべてlongとdoubleを除く複数のスレッドからの書き込み\読み出しがアトミック操作であり、長いだけとダブルで揮発性を使用する必要がありますというのは本当でしょうか?

+1

、それは他のスレッドがすぐに更新された値を参照してください(とそれが出て最適化することができないこと)ができることを意味し、単にアトミック

を値を書き込む以外の意味を持っていますが、ソースを持っていますかこのため? – paislee

答えて

8

あなたはJLSのthis sectionを参照しているようですね。 doublelongを除くすべてのプリミティブ型で、実際にその変数に書き込まれた値はすべてとなります。 (doublelongの場合、最初の4バイトは1つのスレッドによって書き込まれ、最後の4バイトは別のスレッドによって書き込まれる可能性があります)。と同じの値は必ずしも表示されません。変数がvolatileと表示されていない限り、同じ時間です。それは、読み取りおよび書き込みを行いいる、x = x + 3をだし、読み取りと書き込みの間xへの書き込みがあるかもしれないので、でもvolatileを使用して

x += 3は、アトミックではありません。だから私たちはAtomicIntegerのようなものを持っていて、他のユーティリティはjava.util.concurrentです。

0

これは正しいとは言えません。

アトミック操作は、別のスレッドが完了するまで、すべてのスレッドがリソースにアクセスするのを強制的に待機させる操作です。なぜ他のデータ型がアトミックであるのか、他のデータ型はアトミックでないのか分かりません。

3

アトミックとスレッドセーフを混同しないでください。長い書込みと2回書込みは、それぞれ2つの別々の32ビット・ストアであるため、アトミックではありません。非long/doubleフィールドの格納とロードは、コンパウンドではないと仮定すると完全にアトミックです(例えばi++)。

アトミック(atomic)私は、多くのスレッドが同じフィールドに異なるオブジェクトを書き込んだ結果、文字化けしたオブジェクトを読み取らないことを意味します。 Java Concurrency In Practice 3.1.2

から

アウト・オブ・シン・アイレ安全性:スレッドが 同期せずに変数を読み取ると、それは古い値が表示されることがありますが、少なくともそれは 値を見ていますいくつかのスレッドによって実際にそこに置かれました ランダム値。これは、揮発性ではない64ビット長と 倍を除くすべての変数に当てはまります。 JVMは、64ビットの をアトミックではない2つの別々の32ビット操作として扱うことができます。

0

揮発性

関連する問題