web-dev-qa-db-ja.com

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

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

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

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

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

Longおよびdoubleの操作は、一般的な64ビットCPUで行われます アトミックも ですが、保証はありません。こちらもご覧ください 機能リクエスト

93
maaartinus

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

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

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

seemは、AtomicLong.Javaのこのメソッドに基づいて、longの割り当てがアトミックであることを示します。

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

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

0
Lyle Z