ブロックキューBlockingQueueの概要
2851 ワード
ブロックキューについては,具体的にソースプロファイルの文章をいくつか書いた. ArrayBlockingQueueソースコード解析 LinkedBlockingQueueソースコード解析 PriorityBlockingQueueソースコード解析 SynchronousQueueソースコード解析 DelayQueueソースコード解析 よく使われるこれらのブロックキューは、一つ一つ解析されています.
今日は大まかなまとめをします.
.スレッドセキュリティ ブロックキューは、まず、スレッドが安全であること、すなわち、マルチ同時性をサポートしていることを強調します.
言うまでもなく、スレッドセキュリティとは、エンキューアウトなどの操作を指し、内部にロックや他の同時制御技術が使用されている.
例えばCAS、例えば遅延キューのリーダー設計.
しかし、ブロックキューで提供される集合操作は、スレッドが安全ではありません.
例えばブロック 渋滞とは、大体の意味は:
キューがいっぱいの場合、エレメントを入れるには、キューに空席があるまで待ってからエレメントを入れます.
キューが空の場合、要素を取り出すには、キューに新しい要素があるまで待ってから取り出させます.
すべてのエンキュー/アウト操作がブロックされるわけではありません.
たとえば、要素の挿入
BlockingQueueのAPIメソッドは豊富で,自分のニーズに応じて異なるメソッドを選択できる. null値 を受け入れない
nullをブロックキューに挿入することはできません.
これは前提要求ですが、なぜですか.
いくつかの方法でnullを返す可能性があるので、操作的な意味があります.
例えば ArrayBlockingQueue
配列に基づいて実装され,初期化時に配列の大きさが決定され,拡張もサポートされない.入隊と出隊は同じ鍵だ.
つまり、同じ時刻に、その中の1つの操作しかできず、同じ時刻に出て入隊することは不可能である.
内部には2つのポインタが維持されており、それぞれ出隊の下標、入隊の下標である.
注意が必要なのは、1本のロックですが、Conditionは2つです. LinkedBlockingQueue
チェーンテーブルに基づいて実現すると,容量に制限はないと近似できる.
容量に制限はありませんが、いつもエンキュー操作があると、メモリがオーバーフローしませんか?
ダブルロックを採用し、デキュー操作はデキューロックに対応し、デキュー操作はデキューロックに対応する.
つまり、同时に、出队と入队を并行することができる. PriorityBlockingQueue
特殊なブロックキューで、最下位はPriorityQueue、つまり
エンキュー時にもエンキュー時に要素ソートを効率的に実現し,操作の時間的複雑度はO(logn)である.
デフォルトの初期容量は11で、自動的に拡張できます.
元素が64より少ない場合は、一度に2倍、そうでない場合は一度に50%を拡容する. SynchronousQueue
これはより特殊なブロックキューで、容量は0です.
エンキュー操作とデキュー操作が同時に発生した場合にのみ成功します.
すなわち,Aスレッドのエンキュー操作は,Bスレッドのアウトキュー操作にぶつかり,両者は現場伝達に相当する.
単独の入隊、単独の出隊、失敗するか、ブロックするか.
このブロックキューのコード実装は、CachedThreadPoolで使用されていることがよくわかりません. DelayQueue
これは待ち行列で、最下位はPriorityQueueでソート機能を実現しています.
Delayedというインタフェースが実現され、期限切れのオブジェクトがデキューされるようになりました.
入隊は制限されません.
アウトキューソースコードでは、同時制御が非常によく、リーダー設計もあり、ユニークです.
今日は大まかなまとめをします.
.
言うまでもなく、スレッドセキュリティとは、エンキューアウトなどの操作を指し、内部にロックや他の同時制御技術が使用されている.
例えばCAS、例えば遅延キューのリーダー設計.
しかし、ブロックキューで提供される集合操作は、スレッドが安全ではありません.
例えば
containsAll
removeAll
など、これらの方法はスレッドを安全にするためには、自分で実現する必要がある.キューがいっぱいの場合、エレメントを入れるには、キューに空席があるまで待ってからエレメントを入れます.
キューが空の場合、要素を取り出すには、キューに新しい要素があるまで待ってから取り出させます.
すべてのエンキュー/アウト操作がブロックされるわけではありません.
たとえば、要素の挿入
add( e)
メソッドは、空席がない場合に異常を放出します.offer(e)
メソッドは、空席がない場合、boolean値などの特殊な値を返します.put(e)
メソッドは、空席がない場合にブロックされますoffer(e, time, unit)
メソッドは、一定時間内に空席がない場合、タイムアウトします.BlockingQueueのAPIメソッドは豊富で,自分のニーズに応じて異なるメソッドを選択できる.
nullをブロックキューに挿入することはできません.
NullPointerException()
が直接投げ出されます.これは前提要求ですが、なぜですか.
いくつかの方法でnullを返す可能性があるので、操作的な意味があります.
例えば
poll()
メソッドはnullを返し、キューに要素がないことを示す.配列に基づいて実装され,初期化時に配列の大きさが決定され,拡張もサポートされない.入隊と出隊は同じ鍵だ.
つまり、同じ時刻に、その中の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;
チェーンテーブルに基づいて実現すると,容量に制限はないと近似できる.
容量に制限はありませんが、いつもエンキュー操作があると、メモリがオーバーフローしませんか?
ダブルロックを採用し、デキュー操作はデキューロックに対応し、デキュー操作はデキューロックに対応する.
つまり、同时に、出队と入队を并行することができる.
特殊なブロックキューで、最下位はPriorityQueue、つまり
というデータ構造を使用しています.エンキュー時にもエンキュー時に要素ソートを効率的に実現し,操作の時間的複雑度はO(logn)である.
というデータ構造に詳しい限り、このブロックキューは簡単に理解できます.デフォルトの初期容量は11で、自動的に拡張できます.
元素が64より少ない場合は、一度に2倍、そうでない場合は一度に50%を拡容する.
これはより特殊なブロックキューで、容量は0です.
エンキュー操作とデキュー操作が同時に発生した場合にのみ成功します.
すなわち,Aスレッドのエンキュー操作は,Bスレッドのアウトキュー操作にぶつかり,両者は現場伝達に相当する.
単独の入隊、単独の出隊、失敗するか、ブロックするか.
このブロックキューのコード実装は、CachedThreadPoolで使用されていることがよくわかりません.
これは待ち行列で、最下位はPriorityQueueでソート機能を実現しています.
Delayedというインタフェースが実現され、期限切れのオブジェクトがデキューされるようになりました.
入隊は制限されません.
アウトキューソースコードでは、同時制御が非常によく、リーダー設計もあり、ユニークです.