AtomicReferenceについて簡単な一般的な質問があります。
参照割り当てがJavaでアトミックである場合、なぜAtomicReferenceを使用するのですか?
また、64ビットVMで参照割り当てがアトミックであるかどうかを確認したいのですが。
参照割り当てをアトミックにするために揮発性が必要ですか?
AtomicReferenceについて簡単な一般的な質問があります。
参照割り当てがJavaでアトミックである場合、なぜAtomicReferenceを使用するのですか?
また、64ビットVMで参照割り当てがアトミックであるかどうかを確認したいのですが。
参照割り当てをアトミックにするために揮発性が必要ですか?
参照割り当てがJavaでアトミックである場合、なぜAtomicReferenceを使用するのですか?
新しい値の作成の基礎となる決定が参照の以前の値に依存する可能性がある場合に必要です。たとえば、データ構造のようなLinkedListを実装する場合、前のノードを参照する新しいノードにヘッドを設定する必要はありません。前のノードを読み取ってから新しいノードにヘッドを設定するまでの間に、他のスレッドがヘッド参照の値を同時に更新した可能性があります。スレッドがこの変更を認識しない場合、スレッドは失われます。
参照割り当てをアトミックにするために揮発性が必要ですか?
操作自体は、それを実行するCPUコアでアトミックに実行されますが、他のコアのスレッドが次の読み取りでそれを認識するという保証はありません。
juancn のコメントで説明されているように、私の以前の回答は正しくありませんでした。
Atomic*
それがクラスと揮発性アクセスの違いです。参照の割り当ては、単語のティアリングが発生しないという意味でのみアトミックですが、可視性や並べ替えの保証はありません。Java は、すべてのプリミティブ型と参照に対して、この制限された意味でのアトミック書き込みを保証しますが、long/double に対しては保証しません (64 ビット VM では常にアトミックだと思いますが)。
前の回答
主にcompareAndSet
およびgetAndSet
メソッドに必要です。それ以外の場合、これをアトミックに行うことはできません (2 つの操作が必要です)。