BlockingQueue がほとんどオーバーヘッドを提供しないという考えは、少しミスリードです。ロックを取得すると、かなりのオーバーヘッドが発生します。コンテキストの切り替えだけでも、何千もの命令を話していることになります。それだけでなく、あるスレッドの進行状況が別のスレッドに直接影響します。今では、数年前ほど悪くはありませんが、ノンブロッキングと比較するとかなりのものです。
BlockingQueue の相互排除のためのロックの使用
ArrayBlockingQueue、LinkedBlockingQueue、PriorityBlockingQUeue: 3 つのブロッキング キューです。
ConcurrentLinkedQueue、java 1.7 LinkedTransferQueue: Michael と Scott のノンブロッキング キュー アルゴリズムを使用します。
競合が中程度から低い場合 (これはより現実的なシナリオです)、非ブロッキング キューはブロッキング キューよりもパフォーマンスが大幅に優れています。
そして、ボトルネックがないことについてのスティーブのコメントに注意してください。競合が激しい場合、非ブロッキング アルゴリズムは一定の cas 試行でボトルネックになる可能性がありますが、ブロッキングはスレッドを中断します。次に、激しい競合下にある BlockingQueue が非ブロッキング キューよりもわずかにパフォーマンスが優れていることがわかりますが、そのような種類の競合は決して標準ではありません。