クラスAtomicLongFieldUpdateの実際の使用を知っている人はいますか? 説明を読みましたが、意味がよくわかりませんでした。なぜ私はそれを知りたいのですか?好奇心とOCPJPの準備のため。
前もって感謝します。
クラスAtomicLongFieldUpdateの実際の使用を知っている人はいますか? 説明を読みましたが、意味がよくわかりませんでした。なぜ私はそれを知りたいのですか?好奇心とOCPJPの準備のため。
前もって感謝します。
次のコスト ラダーを考えることができます。
long
: 安価ですが、マルチスレッド アクセスには安全ではありませんvolatile long
: より高価で、マルチスレッド アクセスに対して安全であり、アトミック操作は不可能ですAtomicLong
: 最も高価で、マルチスレッド アクセスに対して安全で、アトミック操作が可能(「安全でない」または「不可能」と言うときは、もちろん「同期のような外部メカニズムがない」ことを意味します。)
マルチスレッド アクセスが必要であるが、ほとんどの操作が単純な読み取りまたは書き込みであり、必要なアトミック オペレーションがわずかしかない場合は、1 つの静的インスタンスを作成AtomicLongFieldUpdate
し、アトミック更新が必要なときにこれを使用できます。メモリ/ランタイム オーバーヘッドはvolatile
、通常の操作と同程度の (または少し高価な) アトミック操作を除いて、単純な変数に似ていAtomicLong
ます。
ここにちょっとしたチュートリアルがあります。
たとえば、AtomicLong を優先して AtomicLongFieldUpdater を使用する理由は、単にヒープ コストを削減するためです。内部的には、どちらも最後に sun.misc.Unsafe を使用する compareAndSet レベルでほとんど同じように機能します。
1000k 回初期化される特定のクラスがあるとします。AtomicLong を使用すると、1000k AtomicLong を作成できます。一方、AtomicLongFieldUpdater を使用すると、1 つの CONSTANT AtomicLongFieldUpdater と 1000k の長さのプリミティブを作成できますが、もちろんそれほど多くのヒープ スペースは必要ありません。
AtomicLongFieldUpdate
クラスの実際の使用を知っている人はいますか?
私はこのクラスを自分で使用したことはありませんが、ワークスペースで get usage を実行すると、その使用の「実際の」インスタンスがいくつか見られます。
com.google.common.util.concurrent.AtomicDouble
はそれを使用して、 usingvolatile long
からのビットを格納する内部フィールドをアトミックに変更します。かなりクール。double
Number.doubleToRawLongBits(...)
net.sf.ehcache.Element
これを使用して、フィールドをアトミックに更新しhitCount
ます。
説明を読みましたが、意味がよくわかりませんでした。
基本的には同じ機能を提供しますAtomicLong
が、別のクラスのローカル フィールドに対して提供します。のメモリ負荷は、フィールドごとに更新の 1 つのインスタンスを構成するという点AtomicLongFieldUpdate
で よりも少ないため、AtomicLong
メモリ オーバーヘッドは低くなりますが、リフレクションによる CPU オーバーヘッドは (わずかではありますが) 増加します。
javadoc は次のように述べています。
このクラスは、同じノードの複数のフィールドが個別にアトミック更新の対象となるアトミック データ構造で使用するために設計されています。
わかりましたが、複数のAtomic*
フィールドを使用するだけです。クラスを使用する唯一の理由は、アトミックにインクリメントしたい変更できない既存のクラスがあった場合です。
アトミックは通常、並列プログラミングで使用されます。
ワークスチール モードでは、async、finish、forasync、isolated、およびatomic 変数のみをサポートします。
アトミックは、並列プログラミングで考慮する必要があるデータ競合やその他の問題からの安全な保護と見なすことができます。