2013-06-21 9 views

答えて

-2

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

work-stealingモードでは、async、finish、forasync、isolated、およびatomic変数のみをサポートします。

パラレルプログラミングで懸念されるデータ競合やその他の問題から、安全な保護としてアトミックを表示できます。

+0

これは、特にAtomicLongFieldUpdateに関する質問には答えません。 – Gray

5

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

  • 普通long:マルチスレッドアクセスのための安価な、しかし危険な
  • volatile long:マルチスレッドアクセスのためのより多く、高価な安全、アトミック操作をない可能
  • AtomicLong
  • :マルチスレッドアクセスのための最も高価な安全、アトミック操作可能

(WHE私は「安全ではない」とか「不可能」と言っているのは、もちろん同期のような外部メカニズムがないということです)。

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

ここにはnice little tutorialがあります。

+0

ちょっとした情報を追加するだけです。 'AtomicLong'はラッパークラスがあるという点で、volatile volatileよりも"高価 "です。また、 'volatile long'は' ++ 'を実行している場合、' 'マルチスレッドアクセスに対して安全ではありません。 – Gray

+0

' AtomicLongFieldUpdate'のメモリオーバーヘッドは、単純な 'AtomicLong'以上のものになります。@Gray ALFUの静的インスタンスを1つ使うことができるので、メモリオーバヘッドは思ったほど大きくはありません。また、私は実行時に、最近のHotSpotバージョンでは、操作は[intrinsified](http://bugs.sun.com/bugdatabase/view_bug.do?bug_id)になっています。 – Gray

+0

1つの静的インスタンスについては正解ですReflection _has_はすべてのアクセスで使用されます。そうでない場合は1つの静的は動作しません@ rxg。 – Gray

2

AtomicLongFieldUpdateクラスの実際の生活は誰でも知っていますか?

私は、このクラスを自分自身使ったことがないが、私のワークスペースに乗るの使用をしている中で、私は、その使用のカップル「実生活」のインスタンスを参照してください。

  • com.google.common.util.concurrent.AtomicDoubleはアトミック彼らを修正するためにそれを使用しています内部volatile longdoubleからのビットを格納するフィールドは、Number.doubleToRawLongBits(...)を使用します。かなりクール。

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

私が説明を読んだが、私はかなりそれの意味を把握していません。

これは基本的にAtomicLongと同じ機能を提供しますが、別のクラスのローカルフィールドにあります。AtomicLongFieldUpdateのメモリ負荷は、フィールドごとに更新のインスタンスを1つ設定するため、メモリのオーバーヘッドは少なくなりますが、リフレクションからのCPUオーバーヘッドは多少なりとも少なくなる点でAtomicLongよりも小さくなります。

のJavadocは言う:

このクラスは、同じノードのいくつかのフィールドは、独立して原子更新の対象とされた原子データ構造で使用するために設計されています。

確かに、私はただ複数のAtomic*フィールドを使用しています。私がクラスを使用する唯一の理由は、私が原子的に増やしたいと思っていた既存のクラスが変更できない場合です。

0

AtomicLongFieldUpdaterは、ヒープコストを削減するだけです。内部的には、両方ともcompareAndSetレベルでほぼ同じように動作し、どちらも両方でsun.misc.Unsafeを使用します。

1000k回初期化された特定のクラスがあるとします。 AtomicLongを使用すると、1000k AtomicLongsを作成できます。一方、AtomicLongFieldUpdaterを使用すると、1つのConstant AtomicLongFieldUpdaterと1000kの長いプリミティブを作成できますが、それにはあまり大きなヒープスペースは必要ありません。

関連する問題