[解決済み】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項
.
関連
-
[解決済み] javascriptでExpression言語を使うには?
-
[解決済み] Eclipseでクラスとそれに対応するファイルの名前を変更する方法は?
-
[解決済み] JavaでInputStreamを読み込んでStringに変換するにはどうすればよいですか?
-
[解決済み] JavaでNullPointerExceptionを回避する方法
-
[解決済み] JavaにおけるHashMapとHashtableの違いは何ですか?
-
[解決済み] Javaでメモリーリークを発生させるにはどうしたらいいですか?
-
[解決済み] JavaでArrayListではなくLinkedListを使用するのはいつですか?
-
[解決済み] Javaにおける "implements Runnable "と "extends Thread "の違いについて
-
[解決済み] ThreadLocal変数はいつ、どのように使用すればよいですか?
-
[解決済み】Android UserManager.isUserAGoat()の正しい使用例?)
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] トークンのシンタックスエラー、これらのトークンを削除してください [closed].
-
[解決済み] Cloneable throws CloneNotSupportedException
-
[解決済み] android.support.v4.app.FragmentActivity' で 'TAG' がプライベートアクセスされている。
-
[解決済み] Java の条件付きコンパイル:コードチャンクをコンパイルしないようにするには?
-
[解決済み] Java の文字列インデックスが範囲外です。0 [閉店]
-
[解決済み] init-paramとcontext-param
-
[解決済み] java.sql.SQLRecoverableException: IO エラーです。NL Exceptionが発生しました
-
[解決済み] IntegerからBigIntegerへの変換
-
[解決済み] ヘッドリカーシオンとテールリカーシオンの違い [重複]について
-
[解決済み] ラムダ式で使用する変数はfinalまたはeffective finalでなければならない