JavaでAtomicReferenceを使用するタイミングは?質問する

JavaでAtomicReferenceを使用するタイミングは?質問する

いつ使うのかAtomicReference?

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

AtomicReference を使用する必要がある簡単な例を示します。

ベストアンサー1

アトミック参照は、単純なアトミック操作(つまり、スレッドセーフ参照に対する、モニターベースの同期が適切ではない、重要な(重要な)操作。処理中にオブジェクトの状態が変化した場合にのみ、特定のフィールドを設定するとします。

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,newValue);

アトミック参照セマンティクスのおかげで、cacheオブジェクトがスレッド間で共有されている場合でも、 を使用せずにこれを行うことができます。一般的に、何をしているのかよく分かっている場合を除き、bare ではなくsynchronizedシンクロナイザーまたはフレームワークを使用する方が適切です。java.util.concurrentAtomic*

このトピックを紹介する 2 つの優れた紙面の参考文献:

注意:(これが常に真実であったかどうかは分かりませんが)参照の割り当て(つまり=)自体はアトミックです(や のようなプリミティブな64ビット型の更新はアトミックではないかもしれませんが、参照の更新は64ビットであっても常にアトミックです)。を参照してください。longdoubleAtomic*
Java 言語仕様第 3 版、セクション 17.7

おすすめ記事