2012-04-24 11 views
2

ConcurrentLinkedQueueやBlockingQueueなどの組み込みキューのいずれかを使用すると、単一コールはアトミックであり、スレッドセーフであることが保証されます。 しかし、時にAPIへの呼び出し5の、4つの呼び出しは、単一のですが、1つの呼び出しの形式は次のとおりです。ConcurrentLinkedQueueを非アトミック操作で使用する

if(some condition) 
{ 
    queue.call(); 
} 

この操作は非アトミックであるため、この呼び出しは同期ブロックにする必要があります。 しかし、この呼び出しを導入しても、このキューへのすべてのアクセスは、読み書きかどうかは関係ありません。

もしそうなら、コード内で非アトミックな呼び出しが1回起きたら、その可能性が高いと思いますが、ファンシーキューへのアクセスはすべて手動で同期する必要がありますか?

+1

条件はなんですか?それはキューに関連していますか? – axtavt

+0

はい、queue.isEmpty()のようなものです。 –

+1

正しく使用すると、キューを同期する必要はありません。あなたがExecutorServiceを使用している場合、キューを直接使用する必要はまれです。 –

答えて

3

ConcurrentLinkedQueueは、あなたが想定しているものと全く同じ原子保証をしません。

メモリー整合性効果:アクセス やから、その要素の除去後に ConcurrentLinkedQueue起こる-前アクションにオブジェクトを配置する前に、他の並行処理コレクションと同様に、スレッド内 アクションのjavadocから他の スレッドのConcurrentLinkedQueue

LinkedListまたは何かをCollections.synchronizedListにラップするのと同じではありません。例えば、異なるスレッドはsize()と異なる回答を見ることがあります。これは、コレクションがロックされないためです。

あなたのコメントに基づいて、おそらくif文をQueuepollへの1回の呼び出しで置き換えて、取り出された要素がnullであるかどうかを確認できます。

関連する問題