ブロックキューBlockingQueueの概要


ブロックキューについては,具体的にソースプロファイルの文章をいくつか書いた.
  • ArrayBlockingQueueソースコード解析
  • LinkedBlockingQueueソースコード解析
  • PriorityBlockingQueueソースコード解析
  • SynchronousQueueソースコード解析
  • DelayQueueソースコード解析
  • よく使われるこれらのブロックキューは、一つ一つ解析されています.
    今日は大まかなまとめをします.
    .
  • スレッドセキュリティ
  • ブロックキューは、まず、スレッドが安全であること、すなわち、マルチ同時性をサポートしていることを強調します.
    言うまでもなく、スレッドセキュリティとは、エンキューアウトなどの操作を指し、内部にロックや他の同時制御技術が使用されている.
    例えばCAS、例えば遅延キューのリーダー設計.
    しかし、ブロックキューで提供される集合操作は、スレッドが安全ではありません.
    例えばcontainsAll removeAllなど、これらの方法はスレッドを安全にするためには、自分で実現する必要がある.
  • ブロック
  • 渋滞とは、大体の意味は:
    キューがいっぱいの場合、エレメントを入れるには、キューに空席があるまで待ってからエレメントを入れます.
    キューが空の場合、要素を取り出すには、キューに新しい要素があるまで待ってから取り出させます.
    すべてのエンキュー/アウト操作がブロックされるわけではありません.
    たとえば、要素の挿入add( e)メソッドは、空席がない場合に異常を放出します.offer(e)メソッドは、空席がない場合、boolean値などの特殊な値を返します.put(e)メソッドは、空席がない場合にブロックされますoffer(e, time, unit)メソッドは、一定時間内に空席がない場合、タイムアウトします.
    BlockingQueueのAPIメソッドは豊富で,自分のニーズに応じて異なるメソッドを選択できる.
  • null値
  • を受け入れない
    nullをブロックキューに挿入することはできません.NullPointerException()が直接投げ出されます.
    これは前提要求ですが、なぜですか.
    いくつかの方法でnullを返す可能性があるので、操作的な意味があります.
    例えばpoll()メソッドはnullを返し、キューに要素がないことを示す.
  • ArrayBlockingQueue

  • 配列に基づいて実装され,初期化時に配列の大きさが決定され,拡張もサポートされない.入隊と出隊は同じ鍵だ.
    つまり、同じ時刻に、その中の1つの操作しかできず、同じ時刻に出て入隊することは不可能である.
    内部には2つのポインタが維持されており、それぞれ出隊の下標、入隊の下標である.
    注意が必要なのは、1本のロックですが、Conditionは2つです.
        /** Main lock guarding all access */
        final ReentrantLock lock;
    
        /** Condition for waiting takes */
        private final Condition notEmpty;
    
        /** Condition for waiting puts */
        private final Condition notFull;
    
  • LinkedBlockingQueue

  • チェーンテーブルに基づいて実現すると,容量に制限はないと近似できる.
    容量に制限はありませんが、いつもエンキュー操作があると、メモリがオーバーフローしませんか?
    ダブルロックを採用し、デキュー操作はデキューロックに対応し、デキュー操作はデキューロックに対応する.
    つまり、同时に、出队と入队を并行することができる.
  • PriorityBlockingQueue

  • 特殊なブロックキューで、最下位はPriorityQueue、つまり というデータ構造を使用しています.
    エンキュー時にもエンキュー時に要素ソートを効率的に実現し,操作の時間的複雑度はO(logn)である. というデータ構造に詳しい限り、このブロックキューは簡単に理解できます.
    デフォルトの初期容量は11で、自動的に拡張できます.
    元素が64より少ない場合は、一度に2倍、そうでない場合は一度に50%を拡容する.
  • SynchronousQueue

  • これはより特殊なブロックキューで、容量は0です.
    エンキュー操作とデキュー操作が同時に発生した場合にのみ成功します.
    すなわち,Aスレッドのエンキュー操作は,Bスレッドのアウトキュー操作にぶつかり,両者は現場伝達に相当する.
    単独の入隊、単独の出隊、失敗するか、ブロックするか.
    このブロックキューのコード実装は、CachedThreadPoolで使用されていることがよくわかりません.
  • DelayQueue

  • これは待ち行列で、最下位はPriorityQueueでソート機能を実現しています.
    Delayedというインタフェースが実現され、期限切れのオブジェクトがデキューされるようになりました.
    入隊は制限されません.
    アウトキューソースコードでは、同時制御が非常によく、リーダー設計もあり、ユニークです.