クラスの実生活を知っている人は誰ですかAtomicLongFieldUpdate? 私は説明を読んだが、私はそれの意味をあまり理解していない。 なぜそれを知りたいですか?好奇心とOCPJP準備。AtomicLongFieldUpdateクラスの実際の使用と説明
ありがとうございます。
クラスの実生活を知っている人は誰ですかAtomicLongFieldUpdate? 私は説明を読んだが、私はそれの意味をあまり理解していない。 なぜそれを知りたいですか?好奇心とOCPJP準備。AtomicLongFieldUpdateクラスの実際の使用と説明
ありがとうございます。
通常、アトミックは並列プログラミングで使用されます。
work-stealingモードでは、async、finish、forasync、isolated、およびatomic変数のみをサポートします。
パラレルプログラミングで懸念されるデータ競合やその他の問題から、安全な保護としてアトミックを表示できます。
次のコストラダーと考えることができます:
long
:マルチスレッドアクセスのための安価な、しかし危険なvolatile long
:マルチスレッドアクセスのためのより多く、高価な安全、アトミック操作をない可能 AtomicLong
(WHE私は「安全ではない」とか「不可能」と言っているのは、もちろん同期のような外部メカニズムがないということです)。
マルチスレッドアクセスが必要な場合、ほとんどの操作は単純な読み込みまたは書き込みですわずかなアトミック操作が必要な場合は、AtomicLongFieldUpdate
の1つの静的インスタンスを作成し、アトミック更新が必要な場合にこれを使用できます。メモリ/ランタイムオーバーヘッドは、通常のAtomicLong
操作のオーダーである(またはわずかに高価な)アトミック操作を除いて、単純なvolatile
変数に似ています。
ここにはnice little tutorialがあります。
ちょっとした情報を追加するだけです。 'AtomicLong'はラッパークラスがあるという点で、volatile volatileよりも"高価 "です。また、 'volatile long'は' ++ 'を実行している場合、' 'マルチスレッドアクセスに対して安全ではありません。 – Gray
' AtomicLongFieldUpdate'のメモリオーバーヘッドは、単純な 'AtomicLong'以上のものになります。@Gray ALFUの静的インスタンスを1つ使うことができるので、メモリオーバヘッドは思ったほど大きくはありません。また、私は実行時に、最近のHotSpotバージョンでは、操作は[intrinsified](http://bugs.sun.com/bugdatabase/view_bug.do?bug_id)になっています。 – Gray
1つの静的インスタンスについては正解ですReflection _has_はすべてのアクセスで使用されます。そうでない場合は1つの静的は動作しません@ rxg。 – Gray
AtomicLongFieldUpdate
クラスの実際の生活は誰でも知っていますか?
私は、このクラスを自分自身使ったことがないが、私のワークスペースに乗るの使用をしている中で、私は、その使用のカップル「実生活」のインスタンスを参照してください。
com.google.common.util.concurrent.AtomicDouble
はアトミック彼らを修正するためにそれを使用しています内部volatile long
double
からのビットを格納するフィールドは、Number.doubleToRawLongBits(...)
を使用します。かなりクール。
net.sf.ehcache.Element
は、それをhitCount
フィールドをアトミックに更新するために使用します。
私が説明を読んだが、私はかなりそれの意味を把握していません。
これは基本的にAtomicLong
と同じ機能を提供しますが、別のクラスのローカルフィールドにあります。AtomicLongFieldUpdate
のメモリ負荷は、フィールドごとに更新のインスタンスを1つ設定するため、メモリのオーバーヘッドは少なくなりますが、リフレクションからのCPUオーバーヘッドは多少なりとも少なくなる点でAtomicLong
よりも小さくなります。
のJavadocは言う:
このクラスは、同じノードのいくつかのフィールドは、独立して原子更新の対象とされた原子データ構造で使用するために設計されています。
確かに、私はただ複数のAtomic*
フィールドを使用しています。私がクラスを使用する唯一の理由は、私が原子的に増やしたいと思っていた既存のクラスが変更できない場合です。
AtomicLongFieldUpdaterは、ヒープコストを削減するだけです。内部的には、両方ともcompareAndSetレベルでほぼ同じように動作し、どちらも両方でsun.misc.Unsafeを使用します。
1000k回初期化された特定のクラスがあるとします。 AtomicLongを使用すると、1000k AtomicLongsを作成できます。一方、AtomicLongFieldUpdaterを使用すると、1つのConstant AtomicLongFieldUpdaterと1000kの長いプリミティブを作成できますが、それにはあまり大きなヒープスペースは必要ありません。
これは、特にAtomicLongFieldUpdateに関する質問には答えません。 – Gray