ArrayBlockingQueue
は、サイズが作成後に変更されない配列によってサポートされます。容量をInteger.MAX_VALUE
に設定すると、スペースのコストが高い大きなアレイが作成されます。 ArrayBlockingQueue
は常に境界付きです。
LinkedBlockingQueue
は、capacity
に達するまでノードを動的に作成します。これはデフォルトでInteger.MAX_VALUE
です。このような大きな容量を使用しても、スペースに余分なコストはかかりません。 LinkedBlockingQueue
はオプションで制限されます。
ArrayBlockingQueue<E>
および LinkedBlockingQueue<E>
は、BlockingQueue<E>
インターフェイスの一般的な実装です。
ArrayBlockingQueue
はarray
によって支えられ、Queue
はFIFO
として順序を課します。キューの先頭は時間的に最も古い要素であり、キューの末尾は最も若い要素です。 ArrayBlockingQueue
は固定サイズのバウンドバッファーでもありますが、LinkedBlockingQueue
はリンクノードの上に構築されるオプションのバウンドキューです。
オプションの容量制限コンストラクタ引数は、容量が指定されていない場合、Integer.MAX_VALUE
と等しいため、過度のキュー拡張を防ぐ方法として機能します。
続きを読む here 。
ベンチマーク: http://www.javacodegeeks.com/2010/09/Java-best-practices-queue-battle-and.html
ArrayBlockingQueue:
ArrayBlockingQueueは、配列内に要素を内部的に保存する、制限されたブロッキングキューです。制限されているということは、無制限の量の要素を保存できないことを意味します。同時に格納できる要素の数には上限があります。インスタンス化時に上限を設定し、その後は変更できません。
LinkedBlockingQueue
LinkedBlockingQueueは、リンクされた構造(リンクされたノード)の要素を内部的に保持します。必要に応じて、このリンクされた構造にオプションで上限を設定できます。上限が指定されていない場合、Integer.MAX_VALUEが上限として使用されます。
類似性
ArrayBlockingQueue/LinkedBlockingQueueは、FIFO(先入れ先出し)の順序で要素を内部に保存します。キューの先頭は、最も長い時間キューに置かれた要素であり、キューは、キューに最短時間であった要素です。
差
LinkedBlockingQueueの実装では2つのロックキューアルゴリズムが使用されています。したがって、LinkedBlockingQueueのテイクとプットは同時に機能しますが、ArrayBlockingQueueの場合はそうではありません。 ArrayBlockingQueueで単一のロックを使用する理由は、ArrayBlockingQueueがエントリの上書きを避ける必要があるため、開始と終了がどこにあるかを知る必要があるためです。 LinkedBlockQueueは、GCがキュー内のノードのクリーンアップを心配するため、これを知る必要はありません。
ArrayBlockingQueueへの要素の追加は、バッキングオブジェクト配列の要素への参照のみを設定することを意味するため、より高速であると想定されます。LinkedBlockingQueueへの要素の追加は、Node prevおよびnextフィールド。さらに、LinkedBlockingQueueから要素を削除すると、削除されたNodeはアプリのパフォーマンスに影響する可能性のあるゴミになります。
メモリ消費に関しては、ArrayBlockingQueueは空の場合でも常に全容量のオブジェクト配列を保持します。一方、LinkedBlockingQueueの1つの要素は、Node 3つのObjectフィールドを持つObjectを使用したものです。