2016-09-27 5 views
3

の同期オペレーションをatomicにする?は同期リスト

+1

私はこの質問がリンクで与えられたものの倍数ではないと思っています。これはリストのコードブロックを同期することを要求し、もう1つは単一のメソッド呼び出しを同期させることです。彼らの答えは異なっています(このために必要で、他には必要ではありません)。 – uoyilmaz

+1

@uoyilmazこれは 'synchronizedList'メソッドで' synchronized'を使用することを目的としたカノニカルです。そして、[答え](http://stackoverflow.com/a/9468329/1743880)もこの点をカバーしています:*ブロックがリスト[...]で複数の操作を実行する場合、同期は余分ではありません* – Tunaki

答えて

3

私は上記のステートメントをsynchronized(list){ ... }の中にラップして操作をアトミックにする必要がありますか?

はいそうでない場合は、あなたのList競合状態がを発行引き起こす可能性がありますがcontainsaddを呼び出す時間ウィンドウ内のコードの別の場所で変更することができます。

それで私は何を使用するのですか Collections.synchronizedList

Collections.synchronizedListは、あなたが、同時にそれを変更することができますが、それでもすべてのメソッド呼び出しがアトミックに実行されていることをごListスレッドセーフでは、このようなことができます。上のケースではcontainsaddと呼びます。アトミックに実行する必要があるのは、addという別の場所にcontainsの結果が出て、競合状態の問題になる場合があるからです。競合状態の問題を回避する唯一の方法は、同じオブジェクトモニタの同期ブロックを使用することです(list)。

+0

それは私になりますそれからCollections.SynchronizedListの使用は何ですか? –

+0

@ShirgillFarhanAnsari remove()を並列に呼び出す2つのスレッドを仮定します。基礎となるリストが同期されていない場合、面白いことが起こります。ポイントは** sync'edリストへの**独立**変更が並行して起こるときの問題を防ぐことです。あなたは「一緒に属している」という一連の呼び出しについて話しています! – GhostCat

+1

ご協力ありがとうございます。私はあなたのプロフィールを見た。あなたは私がそれがJEEだと思ったのと同じように。決してJEEだったことはありません。 JavaEEについては、Web Application Specialist BalusC(JSF 2.3 Expert Groupのメンバー)がこれを修正しました。 –

1

正しい。理論的には、あなたのステートメント1とステートメント3の間には何も起こりません。したがって、もしあなたがそれらが "原子力"で起こることを望むのであれば;それらを「単一のトランザクション」に変える何らかの方法が必要です。

synchronized(list)を使用すると、そこにアクセスするのに合理的な方法です。

2

はい、同期リストはメソッド呼び出しをアトミックにしますが、複数のステートメントをアトミックにする場合(たとえば、リストを反復する場合など)には、アクセスを同期させる必要があります。