7

クラスAtomicLongFieldUpdateの実際の使用を知っている人はいますか? 説明を読みましたが、意味がよくわかりませんでした。なぜ私はそれを知りたいのですか?好奇心とOCPJPの準備のため。

前もって感謝します。

4

5 に答える 5

7

次のコスト ラダーを考えることができます。

  • 通常long: 安価ですが、マルチスレッド アクセスには安全ではありません
  • volatile long: より高価で、マルチスレッド アクセスに対して安全であり、アトミック操作は不可能です
  • AtomicLong: 最も高価で、マルチスレッド アクセスに対して安全で、アトミック操作が可能

(「安全でない」または「不可能」と言うときは、もちろん「同期のような外部メカニズムがない」ことを意味します。)

マルチスレッド アクセスが必要であるが、ほとんどの操作が単純な読み取りまたは書き込みであり、必要なアトミック オペレーションがわずかしかない場合は、1 つの静的インスタンスを作成AtomicLongFieldUpdateし、アトミック更新が必要なときにこれを使用できます。メモリ/ランタイム オーバーヘッドはvolatile、通常の操作と同程度の (または少し高価な) アトミック操作を除いて、単純な変数に似ていAtomicLongます。

ここにちょっとしたチュートリアルがあります。

于 2013-06-21T17:01:25.763 に答える
4

たとえば、AtomicLong を優先して AtomicLongFieldUpdater を使用する理由は、単にヒープ コストを削減するためです。内部的には、どちらも最後に sun.misc.Unsafe を使用する compareAndSet レベルでほとんど同じように機能します。

1000k 回初期化される特定のクラスがあるとします。AtomicLong を使用すると、1000k AtomicLong を作成できます。一方、AtomicLongFieldUpdater を使用すると、1 つの CONSTANT AtomicLongFieldUpdater と 1000k の長さのプリミティブを作成できますが、もちろんそれほど多くのヒープ スペースは必要ありません。

于 2015-02-16T13:07:49.590 に答える
2

AtomicLongFieldUpdateクラスの実際の使用を知っている人はいますか?

私はこのクラスを自分で使用したことはありませんが、ワークスペースで get usage を実行すると、その使用の「実際の」インスタンスがいくつか見られます。

  • com.google.common.util.concurrent.AtomicDoubleはそれを使用して、 usingvolatile longからのビットを格納する内部フィールドをアトミ​​ックに変更します。かなりクール。doubleNumber.doubleToRawLongBits(...)

  • net.sf.ehcache.Elementこれを使用して、フィールドをアトミ​​ックに更新しhitCountます。

説明を読みましたが、意味がよくわかりませんでした。

基本的には同じ機能を提供しますAtomicLongが、別のクラスのローカル フィールドに対して提供します。のメモリ負荷は、フィールドごとに更新の 1 つのインスタンスを構成するという点AtomicLongFieldUpdateで よりも少ないため、AtomicLongメモリ オーバーヘッドは低くなりますが、リフレクションによる CPU オーバーヘッドは (わずかではありますが) 増加します。

javadoc は次のように述べています。

このクラスは、同じノードの複数のフィールドが個別にアトミック更新の対象となるアトミック データ構造で使用するために設計されています。

わかりましたが、複数のAtomic*フィールドを使用するだけです。クラスを使用する唯一の理由は、アトミックにインクリメントしたい変更できない既存のクラスがあった場合です。

于 2013-06-21T17:08:08.727 に答える
-3

アトミックは通常、並列プログラミングで使用されます。

ワークスチール モードでは、async、finish、forasync、isolated、およびatomic 変数のみをサポートします。

アトミックは、並列プログラミングで考慮する必要があるデータ競合やその他の問題からの安全な保護と見なすことができます。

于 2013-06-21T16:12:14.377 に答える