2017-04-12 8 views
2

コードにはAtomicBooleanフィールドが含まれています。これらのフィールドのget()set()のメソッドだけが呼び出されます。get()およびset()メソッドのみを使用する場合、AtomicBooleanをプリミティブ型に置き換えますか?

これらのフィールドの型を安全にプリミティブブール値に置き換えることはできますか?

つまり、プリミティブブール値の割り当てとアクセス操作は、Javaのアトミック操作です。そしてその観点から私の場合はAtomicBooleanを使用する理由は見当たりません。

私の理解では、compareAndSetのようなメソッドが使用されている場合にのみ、比較とアクセスを組み合わせることができます。AtomicBoolean私はそれについて間違っていますか?理由を説明できますか?

+4

問題のコードを表示することなく広すぎますが、一般的な回答はいいえです。 –

+1

異なるスレッドからフィールドにアクセスしていますか? – VGR

+0

競合状態には、check-then-actとread-modify-writeの2種類があります。 'AtomicBoolean'をプリミティブブールに置き換えると、前者の問題になります。 – mre

答えて

5

アトミック変数が「より良い揮発性物質」の実践でのJava並行処理(項15.3を参照)として記載されています。ここでは、この本からの抜粋です:

アトミック変数クラスは、リード・モディファイ・ライト操作をアトミック条件をサポートするためのvolatile 変数の一般化を提供します。 AtomicIntegerはの値を表し、およびset のメソッドを提供し、 volatile intへの読み取りと書き込みと同じメモリセマンティクスを提供します。

応用あなたのケースに、これはあなたがAtomicBooleanの唯一get()set()メソッドを使用している場合、彼らは安全に読み取り書き込みvolatile booleanに置き換えることができることを意味しています。

volatileは、すべてのスレッドにの最新のの値が表示されることを保証するために必要です。戻る実践のJava並行処理(セクション3.1.4)に:フィールドがvolatile宣言され

、コンパイラとランタイムがこの変数が共有されていること 通知にし、その上に操作が べきではないと入れています他のメモリ操作と並び替えることができます。変数は であり、他の プロセッサから隠されているレジスタまたはキャッシュにはキャッシュされないため、volatile変数を読み取ると、常に最新の書き込みがすべてのスレッドによって返されます。

+0

お返事ありがとうございます。私の状況で、揮発性のないプリミティブなブール値がなぜ機能しないのか説明できますか?または、私の場合、プリミティブブール値を使用するときに問題につながるシナリオを記述できますか? – eztam

+1

@eztam AtomicBooleanが参照として渡されます。 'boolean'を2つのスレッドに渡すと、共有された値はなくなります。 –

+2

@eztam。プリミティブ 'boolean'を使用して問題を引き起こす唯一のシナリオは、_check-then-act_オペレーションでそれを使用することです。この場合、 'AtomicBoolean'を使うべきです(あるいは同期を使う)。 –

-1

答えはいいえです。あなたはここに理由のWhy can't AtomicBoolean be a replacement for Boolean?

+2

そのポストは逆の置き換えです: 'Boolean'を' AtomicBoolean'に置き換えてください。 –

+0

はい。しかし、答えを読むと、AtomicBooleanは並行処理のために設計された別のクラスであることが説明されています。したがって、AtomicBooleanはスレッドセーフです。したがって、それをプリミティブブールで置き換えることはできません。 – MigSena

+0

コードでAtomicBooleanを使用したくない場合は、プリミティブブール値を使用できますが、同期を使用してスレッドセーフプロパティを自分で処理する必要があります。 – MigSena

2

を見つけることができ、これらのフィールドのタイプは、安全に、プリミティブboolean型に置き換えることができますか?

単純なプリミティブbooleanは、(マルチスレッド環境におけるアトミックアクセスを提供)AtomicBooleanと同じではありません。

しかし、安全な代替方法では、アトミックアクセスも提供するvolatile booleanを使用している可能性がありますが、AtomicBooleanをそのまま使用することをお勧めします。

+0

プリミティブブール値とAtomicBooleanの違いはわかります。しかし、自分の状況でそれを置き換えることができない理由を説明できますか? – eztam

+0

なぜあなたはそれをしたいのですか?私はあなたが正確に何を期待しているのかを意味していますか?すでにAtomic(AtomicBooleanを使用しているので)のアクセスは原子的なので、なぜあなたは既存の動作を変更したいのですか? – developer