同じ:
1。LinkedBlockingQueueとArrayBlockingQueueはどちらもBlockingQueueインターフェイスを実装しています。
2。LinkedBlockingQueueとArrayBlockingQueueはどちらもブロック可能なキューです
REENTRANTLANTLOCKと条件は、生産と消費の同期を確実にするために内部で使用されます。
キューが空の場合、消費者スレッドはブロックされます。キューがいっぱいになると、プロデューサーのスレッドがブロックされます。
条件方法を使用して、同期して通信します。
違う:
1。上記の写真からわかるように、それらのロックメカニズムは異なります。
LinkedBlockingQueueのロックは分離されています。プロデューサーのロックプットロック、消費者のロックTakelock
ArrayBlockingQueueプロデューサーと消費者は同じロックを使用しています。
2。それらの基礎となる実装メカニズムも異なります
LinkedBlockingQueueは、リンクされたリスト構造を内部的に維持します
生産と消費中に、挿入または取り外しのためにノードオブジェクトを作成する必要があります。データのバッチが多いシステムでは、GCへの圧力が大きくなります。
ArrayBlockingQueueは、内部的に配列を維持します
生産と消費中、列挙オブジェクトが直接挿入または削除され、追加のオブジェクトインスタンスが生成または破壊されません。
3。建設の違い
LinkedBlockingQueueのデフォルトの容量サイズ:integer.max_value、もちろん、指定された容量サイズを渡すこともできます。
ArrayBlockingQueueを初期化する場合、容量の値を渡す必要があります。
あなたはそれによって提供された建設方法を見ることで知ることができます
4。clear()メソッドを実行します
LinkedBlockingQueueがクリアメソッドを実行すると、2つのロックが追加されます。
5。統計要素の数
AtomicIntegerオブジェクトは、LinkedBlockingQueueで使用され、要素の数をカウントします
ArrayBlockingQueueは、INTタイプを使用して要素をカウントします