2

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

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

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

はいの場合、単一の非アトミック呼び出しがコードに忍び寄ると、ファンシーキューへのすべてのアクセスを手動で同期する必要があると想定できますか?

4

1 に答える 1

3

ConcurrentLinkedQueueあなたが想定するのとまったく同じアトミックな保証はしません。javadoc から:

メモリの一貫性の影響: 他の並行コレクションと同様に、オブジェクトを ConcurrentLinkedQueue に配置する前のスレッド内のアクションは、別のスレッドの ConcurrentLinkedQueue からのその要素へのアクセスまたは削除に続くアクションの前に発生します。

LinkedListaまたは何かをCollections.synchronizedList;でラップするのと同じではありません。size()たとえば、コレクションをロックしないため、スレッドが異なれば に対して異なる回答が表示される場合があります。

コメントに基づいて、おそらく if ステートメントをQueue'sへの単一の呼び出しに置き換えpoll、取得した要素が null かどうかを確認できます。

于 2012-04-24T08:40:44.063 に答える