2011-11-15 10 views
2

原子の読み取りとアトミック書き込みを確実にする方法は?私は次のように原子が整数(int型ではない)と、他の人に読み込み、アトミック書き込みたい

volatile Double a; // not double 
volatile Long b; // not long 
Integer c; // not int 
Boolean d; // not boolean 

ない場合、どのように私は彼らがアトミックになるだろうか?

編集:説明として、私は読み書きを組み合わせたアトミックな操作は必要ありません。私は原子となるように読みとり、原子は別々に書くことが必要です。

EDIT2:@Peter Lawrey、@PeterLawreyは、これは皮肉である:ここでは Double a; a = 0.5d;aを基準であるため、書き込みがアトミックです。この中で double a; a = 0.5d;の書き込みはアトミックであることは保証されません。さらにDoubledoubleをラップします。もちろん、アトミックに読み書きされた参照を持つ任意のオブジェクトのラップされた内容にも同じことが適用されるとは思っていません。

Edit3:元々、アトミック性がスレッド間の一貫性を保証すると思っていました。私はそうではなく、あなたはまだボラティリティが必要であることを発見しました。

答えて

5

参照へのすべての読み取りまたは書き込みはアトミックです。

あなたは、あなたが読み書きをしたいと思っています。その場合、AtomicReference、AtomicLong、AtomicIntegerまたはAtomicBooleanを適切なものとして使用します。パフォーマンスが重要な場合は、ラッパーの代わりにintlongまたはdoubleを使用します。

スレッド間の一貫性のためには、volatileが必要です。インクリメントやスワップなどのアトミック操作では、AtomicReference、AtomicReferenceFieldUpdater、AtomicLong、AtomicInteger、AtomicBoolean、AtomicIntegerArray、AtomicIntegerFieldUpdater、AtomicLongArray AtomicLongFieldUpdaterクラスを使用できます。 doubleでこのようなアトミック操作を実行するには、Unsafeを使用して独自のアップデータを構築できますが、自己責任で使用してください。 ;)

+0

いいえ私はちょうど原子読み取りを意味しました。そして原子書き込み。彼らは一緒にいる必要はありません。 – H2ONaCl

+0

すべての参照アクセスはアトミックです。アトミックであることが保証されていない唯一のアクセスは、「double」または「long」への不揮発性アクセスです。 –

+0

編集2を参照してください。 – H2ONaCl

関連する問題