2011-01-21 6 views

答えて

80
  • 参照
  • のすべての割り当てvolatile変数
  • のすべての割り当て
  • longとdouble以外のプリミティブ型のすべての割り当てjava.concurrent.Atomicのすべての操作*クラス

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

コメントに記載されているように、アトミック性は可視性を意味するものではありません。したがって、別のスレッドが部分的に書かれたintを見ないことが保証されている間は、新しい値は決して見えないかもしれません。

ロングとダブルの操作は共通の64ビットCPU atomic as wellにありますが、保証はありません。このfeature requestも参照してください。

+18

「volatile」longとdoubleは、アトミックであることが保証されています。http://java.sun.com/docs/books/jls/third_edition/html/memory.html#17.7 –

+10

また、操作はアトミックであるため、特別な注意が払われない限り、マルチスレッドアプリケーションでこれらの操作の可視性が保証されない場合があります(詳細は* way *で説明しています)。 – nos

+0

64ビットjvm、longおよびdouble assigments –

4

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

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

注:それははAtomicLong.javaで、この方法に基づいて、long型の割り当てがアトミックですを思わ

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

..値が常に正確に元の値か設定値のどちらかになるという意味では、スレッドセーフです。ほとんどの最新の値は、必ずしも必然的に「揮発性」または「同期」の欠如のために他のスレッドには見えません。 –

+1

+1に@MikkoWilkmanが言います。このコードは、メモリの可視性の観点からはスレッドセーフではないため、使用しないでください。 –

0

:たとえば

は、次のコードは、スレッドセーフであります同期がない。

+3

'value'の宣言を見てください。それは「揮発性」です。 – maaartinus

+1

'value'は' volatile'で、 'value'アトミックな値を代入しません。単に"発行 "問題を避けるだけです。 –

+6

両方とも実行します。[JLS、セクション17.7](http://docs.oracle.com/javase/specs/jls/se7/html/jls-17.html#jls-17.7):volatile longの書き込みと読み取り二重の値は常にアトミックです。 – maaartinus

関連する問題