1. ホーム

[解決済み】JavaでAtomicReferenceを使用するのはいつ?

2022-03-25 11:50:27

質問

どのような場合に AtomicReference ?

すべてのマルチスレッドプログラムでオブジェクトを作成する必要があるのでしょうか?

AtomicReference を使用すべき簡単な例を挙げてください。

どのように解決するのですか?

アトミックリファレンスは、単純な作業を行うような環境で使用します。 アトミック (例. スレッドセーフ 参照に対する非自明な)操作の場合、モニタベースの同期は適切ではありません。例えば、オブジェクトの状態が最後にチェックしたときのままである場合にのみ、特定のフィールドがあるかどうかをチェックしたいとします。

AtomicReference<Object> cache = new AtomicReference<Object>();

Object cachedValue = new Object();
cache.set(cachedValue);

//... time passes ...
Object cachedValueToUpdate = cache.get();
//... do some work to transform cachedValueToUpdate into a new version
Object newValue = someFunctionOfOld(cachedValueToUpdate);
boolean success = cache.compareAndSet(cachedValue,cachedValueToUpdate);

アトミック参照セマンティクスのため、この操作は cache オブジェクトはスレッド間で共有されます。 synchronized . 一般的には、シンクロナイザーか、あるいは java.util.concurrent フレームワークを使用します。 Atomic* というのは、自分が何をやっているのか分かっている場合のみです。

このトピックを紹介する2つの優れたデッドツリーのリファレンスです。

なお、(昔からそうだったのかどうかは知りませんが) 参照 の代入(つまり = はそれ自体がアトミックです(更新 プリミティブ のような64ビット型は long または double を更新することはアトミックではないかもしれません。 参照 を明示的に使用しなくても、64ビットであっても常にアトミックです)。 Atomic* .

をご覧ください。 Java言語仕様書3ed, 第17.7項 .