5

私がブログを読んだが、私は彼の結論が正しいかどうかはわからない:LinkedBlockingQueueとConcurrentLinkedQueueの違いは何ですか?

http://www.javacodegeeks.com/2010/09/java-best-practices-queue-battle-and.html#ixzz1seaiSLwp

彼は言った:あなたが提供されるパフォーマンス結果から見ることができるようにLinkedBlockingQueueは(追加最高の組み合わせを実現要素を削除する)のパフォーマンス結果が得られ、プロデューサー - コンシューマーのシナリオを実装するための最優秀候補でなければなりません。

私のコードでロックを使用しないと、それは速くないのでしょうか?

なぜ、LinkedBlockingQueueがロックフリーのキュー(ConcurrentLinkedQueue)より速いのですか?

ありがとうございます!

+3

はランダムブログを忘れて:?あなたは*のJavadocを読んで考えた*しませんでした「束縛された」、「束縛されていない」、そして「ブロッキング」という言葉は何も伝えませんか? – EJP

+0

関連:http://stackoverflow.com/q/1426754/931379 – Pursuit

答えて

4

ConcurrentLinkedQueueは、ブロックキューではありません。 BlockingQueueインタフェースを実装していないため、put()メソッドとtake()メソッドをブロックしません。これらのメソッドは、消費者が何もない間にブロックするように、そして消費者が十分に迅速に消費しないときにブロックするようにする必要があるため、プロデューサ/コンシューマのセットアップに必要です。

-1

LinkedBlockingQueueはデキューであり、ConcurrentBlockingQueueはデキューではありません。詳細はJavadocを確認してください

+1

[LinkedBlockingDeque](http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/LinkedBlockingDeque.html)および[LinkedBlockingQueue](http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/LinkedBlockingQueue.html)は、2つの異なるクラスです。 –

+0

私はLInkedBlockingQueueが両端キューではないと思うし、ConcurrentBlockingQueueはJavaランタイムのクラスではないと思います。 –

1

このベンチマークは奇妙です:並列キューをブロックキューとして使用することは意味をなさないか、何か不足しています。このコードは、私が推測する惑星を救うために行くされていません。

while(result == null) 
    result = concurrentLinkedQueue.poll(); 

そしてもちろんよりも効率が低い:

linkedBlockingQueue.take(); 
関連する問題