web-dev-qa-db-ja.com

ArrayBlockingQueueとLinkedBlockingQueueの違いは何ですか

  1. ArrayBlockingQueueを使用した方がよいシナリオと、LinkedBlockingQueueを使用した方がよいシナリオは何ですか?
  2. LinkedBlockingQueueのデフォルトの容量がMAX Integerに等しい場合、それをデフォルトの容量のBlockingQueueとして使用すると本当に役立ちますか?
38
Java_Jack

ArrayBlockingQueueは、サイズが作成後に変更されない配列によってサポートされます。容量をInteger.MAX_VALUEに設定すると、スペースのコストが高い大きなアレイが作成されます。 ArrayBlockingQueueは常に境界付きです。

LinkedBlockingQueueは、capacityに達するまでノードを動的に作成します。これはデフォルトでInteger.MAX_VALUEです。このような大きな容量を使用しても、スペースに余分なコストはかかりません。 LinkedBlockingQueueはオプションで制限されます。

23
Fabian Barney

ArrayBlockingQueue<E> および LinkedBlockingQueue<E> は、BlockingQueue<E>インターフェイスの一般的な実装です。

ArrayBlockingQueuearrayによって支えられ、QueueFIFOとして順序を課します。キューの先頭は時間的に最も古い要素であり、キューの末尾は最も若い要素です。 ArrayBlockingQueueは固定サイズのバウンドバッファーでもありますが、LinkedBlockingQueueはリンクノードの上に構築されるオプションのバウンドキューです。

オプションの容量制限コンストラクタ引数は、容量が指定されていない場合、Integer.MAX_VALUEと等しいため、過度のキュー拡張を防ぐ方法として機能します。

続きを読む here

ベンチマーク: http://www.javacodegeeks.com/2010/09/Java-best-practices-queue-battle-and.html

15
Ankur Lathi

ArrayBlockingQueue

ArrayBlockingQueueは、配列内に要素を内部的に保存する、制限されたブロッキングキューです。制限されているということは、無制限の量の要素を保存できないことを意味します。同時に格納できる要素の数には上限があります。インスタンス化時に上限を設定し、その後は変更できません。

LinkedBlockingQueue

LinkedBlockingQueueは、リンクされた構造(リンクされたノード)の要素を内部的に保持します。必要に応じて、このリンクされた構造にオプションで上限を設定できます。上限が指定されていない場合、Integer.MAX_VALUEが上限として使用されます。

類似性

ArrayBlockingQueue/LinkedBlockingQueueは、FIFO(先入れ先出し)の順序で要素を内部に保存します。キューの先頭は、最も長い時間キューに置かれた要素であり、キューは、キューに最短時間であった要素です。

  • LinkedBlockingQueueには、それぞれ挿入と削除のためのputLockとtakeLockがありますが、ArrayBlockingQueueは1つのロックのみを使用します。
  • ArrayBlockingQueueはシングルロックダブル条件アルゴリズムを使用し、LinkedBlockingQueueは「2ロックキュー」アルゴリズムの変形であり、2ロック2条件(takeLock、putLock)があります。

LinkedBlockingQueueの実装では2つのロックキューアルゴリズムが使用されています。したがって、LinkedBlockingQueueのテイクとプットは同時に機能しますが、ArrayBlockingQueueの場合はそうではありません。 ArrayBlockingQueueで単一のロックを使用する理由は、ArrayBlockingQueueがエントリの上書きを避ける必要があるため、開始と終了がどこにあるかを知る必要があるためです。 LinkedBlockQueueは、GCがキュー内のノードのクリーンアップを心配するため、これを知る必要はありません。

7

ArrayBlockingQueueへの要素の追加は、バッキングオブジェクト配列の要素への参照のみを設定することを意味するため、より高速であると想定されます。LinkedBlockingQueueへの要素の追加は、Node prevおよびnextフィールド。さらに、LinkedBlockingQueueから要素を削除すると、削除されたNodeはアプリのパフォーマンスに影響する可能性のあるゴミになります。

メモリ消費に関しては、ArrayBlockingQueueは空の場合でも常に全容量のオブジェクト配列を保持します。一方、LinkedBlockingQueueの1つの要素は、Node 3つのObjectフィールドを持つObjectを使用したものです。

6