ロックはPriorityBlockingQueue
いくつありますか?take
とput
操作は同期していますか?このタイプのキューに関する多くの情報を見つけることができませんでした。私はシングルスレッドを使用していましたPriorityQueue
。
3 に答える
PriorityBlockingQueue にはいくつのロックがありますか?
それは重要ではない実装の詳細です。それがどのように実装されているかを理解したい場合を除き、ソースコードを確認することをお勧めします。
take と put 操作は同期されていますか?
厳密に言えば、それらはおそらく同期されていませんが、クラスはスレッドセーフであるため、複数のスレッドで同時に取得および配置できます。
注: の javadoc はPriorityBlockingQueue
その点についてあまり明確ではありませんが、java.util.concurrent パッケージの javadoc を見ると、次のように表示されます。
java.util.concurrent の 5 つの実装 (LinkedBlockingQueue、ArrayBlockingQueue、SynchronousQueue、PriorityBlockingQueue、および DelayQueue) は、プットとテイクのブロッキング バージョンを定義する拡張 BlockingQueue インターフェースをサポートします。
BlockingQueue の実装はスレッドセーフです。すべてのキューイング メソッドは、内部ロックまたはその他の形式の同時実行制御を使用して、アトミックに効果を達成します。ただし、一括コレクション操作の addAll、containsAll、retainAll、および removeAll は、実装で特に指定されていない限り、必ずしもアトミックに実行されるとは限りません。
HotSpot Java 7のソースコードを読むと、と呼ばれるロックが1つだけありますlock
。
これはクラスの文書化された要件ではないため、さまざまな実装が可能です。
PriorityBlockingQueueの Javadoc から:
クラス PriorityQueue と同じ順序付け規則を使用し、ブロッキング取得操作を提供する無制限のブロッキング キュー。このキューは論理的に無制限ですが、リソースの枯渇により追加の試行が失敗する場合があります (OutOfMemoryError が発生します)。このクラスは null 要素を許可しません。自然順序付けに依存するプライオリティ キューでは、比較不可能なオブジェクトの挿入も許可されません (これを行うと、ClassCastException が発生します)。
内部実装は無関係です。