ArrayBlockingQueue V.S. LinkedBlockingQueue



Arrayblockingqueue V


私は最近、パッセージ内で「JAVAアプリケーションの基礎と実践を配布しました」

Lin Haoは、ArrayBlockingQueueは固定サイズの配列であり、ブロックすることができ、キューのFIFO ReentrantLockCondition実装を記述しました。

ArrayBlockingQueue、BlockingQueueに加えて、次のリストを構成する格納されたオブジェクトとして実装されたオブジェクトを使用して実装された、さまざまなLinkedBlockingQueue、LinkedBlockingQueueがあります。読み取り専用操作のヘッド、テール、および書き込み専用のため、ここでは2つのロックを巧みに使用し、ポーリングに使用されるロックを使用して、互いに競合しないように別の1つのロックを取得することを提案します。読み取りと書き込みを行うと状況がロックされるため、読み取りと書き込みの同時操作が多い場合のLinkedBlockingQueueの方が多く、パフォーマンスはArrayBlockingQueueよりもはるかに優れており、要素のトラバースと削除では2つのロックがロックされます。


一見したところ、ArrayBlockingQueueはLinkedBlockingQueueがそれほど強力なパフォーマンスではないのですが、ArrayBlockingQueueが存在することの意味は何ですか?彼が個人的にプログラムを書いたというこの質問で、合計4つのプロデューサーが4 * 102,4000 * 10の製品を生産し、4つの消費者が費やし、キューの最大サイズはそれぞれ102,4000です。ArrayBQキューとLinkedBQの比較2は時間でした消費する。 (読者は、得られた結果を直接比較してプログラムを実行できます)。



import java.util.concurrent.BlockingQueue import java.util.concurrent.LinkedBlockingQueue import java.util.concurrent.ArrayBlockingQueue public class ArrayBlockingQueueVsLinkedBlockingQueue { // queue maximum capacity public static final int Q_SIZE = 1024000 // producer / consumer threads public static final int THREAD_NUM = 4 // Products class Product{ String name Product(String name){ this.name = name } } public void test(final BlockingQueue q) throws InterruptedException{ // producer thread class Producer implements Runnable{ @Override public void run() { for(int i=0i


これは私の事故の結果であり、ArrayBQはLinkedBQの半分しか消費していません!そして時間が実行されていますArrayBQがCPUを満たしていない、LinkedBQがいっぱいになりました!


(私のマシンJDK1.6 win7_64 -Xms1024M -Xmx1024M)



(マシンのグループフレンズ)
私はこれを理解していません、小さなLinkedBQがArrayBQを失った小さな競合をロックします。 。 。十分なスレッドですか?
そこで、以下のパラメータを変更しました



// queue maximum capacity public static final int Q_SIZE = 10240 // producer / consumer threads public static final int THREAD_NUM = 1280


その結果、ArrayBQが高速になりました。 。 。

友達のテクノロジー、これは説明ですか?理由がわかっている場合は、必ずメッセージを残して私に知らせてください。

私が今考えているのは、LinkedQueueはNodeを確立し、ArrayBQよりも複雑な操作を行う場合は参照を追加または削除する必要があるということだけです。コピー操作での内部削除のArrayBQ配列は生成されませんが、リングとして、追加または削除はputIndexとtakeIndexのみを変更するため、操作は非常に簡単です。