Javaのどの操作がアトミックと見なされますか?


回答:


100
  • longとdoubleを除くプリミティブ型のすべての割り当て
  • 参照のすべての割り当て
  • 揮発性変数のすべての割り当て
  • java.concurrent.Atomic *クラスのすべての操作

そして多分もっと何か。jlsを見てください。

コメントに記載されているように、原子性は可視性を意味するものではありません。したがって、別のスレッドは部分的に書き込まれたものを認識しないことが保証されていますがint、新しい値を認識しない可能性があります。

longとdoubleの演算は、一般的な64ビットCPUのアトミックでもありますが、保証はありません。この機能リクエストも参照してください。


21
longvolatileとdoubleへの割り当てはアトミックであることが保証されています:java.sun.com/docs/books/jls/third_edition/html/memory.html#17.7
Joonas Pulakka 2011年

12
また、操作はアトミックですが、特別な注意が払われない限り、マルチスレッドアプリケーションではこれらの操作の可視性が保証されない可能性があることに注意してください(ここでの詳細はコメントで説明するのが複雑な方法です。)
nos

5
64 bit jvm, long and double assignments are also atomic.本気ですか?コンパイルされたコード用だと思いますが、インタープリターコードはどうですか?おそらくあなたは正しいですが、保証はありますか?
maaartinus 2011年

4
仕様では、64ビットJVMが長い二重割り当てにアトミック性を提供することをまだ義務付けていません。java.sun.com/docs/books/jls/third_edition/html/memory.html#17.7有名な言葉で、「この動作は実装固有です」。ただし、ほとんどの場合、64ビットVMはそれをアトミック操作として実装します。
sjlee 2011年

1
IMHO、通常の参照割り当てはアトミックですが、AtomicReferenceは、compareAndSetとgetAndSetを提供します。これは、同期なしでは実現できないものです。
maaartinus 2011年

5

Javaでは、32ビット以下の量の読み取りと書き込みはアトミックであることが保証されています。
アトミックとは、各アクションが1つのステップで実行され、中断できないことを意味します。したがって、マルチスレッドアプリケーションがある場合、読み取り操作と書き込み操作はスレッドセーフであり、同期させる必要はありません。

たとえば、次のコードはスレッドセーフです。

public class ThreadSafe   
  {  
    private int x;  
    public void setX(int x)  
          {
           this.x = x;
           } 
  }

5
..値が常に元の値または設定値のいずれかであるという意味でのスレッドセーフ。「揮発性」または「同期」がないため、ほとんどの最新の値は必ずしも他のスレッドに表示されません。
ミッコウィルクマン2011

1
@MikkoWilkmanの言うことへの+1。このコードは、メモリの可視性の観点からスレッドセーフではないため、使用しないでください。
エキドナをナックルズザエキドナ2016年

0

考え思われるlong値の割り当てはAtomicLong.javaで、この方法に基づいて、アトミックであることを。

public final void set(long newValue) {
    value = newValue;
}

同期がないことに注意してください。


3
の宣言を見てくださいvalue。ですvolatile
maaartinus 2013年

2
それvaluevolatileの割り当てがありませんvalueアトミック、それは単に避け、「公開」の問題を。
ライルZ

7
両方を実行します。JLSのセクション17.7を参照してください。揮発性のlong値とdouble値の書き込みと読み取りは常にアトミックです。
maaartinus 2013年

@LyleZ私の意見では、このスレッドで最も価値のあるコメントです。
stdout
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.