6

ロックはPriorityBlockingQueueいくつありますか?takeput操作は同期していますか?このタイプのキューに関する多くの情報を見つけることができませんでした。私はシングルスレッドを使用していましたPriorityQueue

4

3 に答える 3

17

PriorityBlockingQueue にはいくつのロックがありますか?

それは重要ではない実装の詳細です。それがどのように実装されているかを理解したい場合を除き、ソースコードを確認することをお勧めします。

take と put 操作は同期されていますか?

厳密に言えば、それらはおそらく同期されていませんが、クラスはスレッドセーフであるため、複数のスレッドで同時に取得および配置できます。

注: の javadoc はPriorityBlockingQueueその点についてあまり明確ではありませんが、java.util.concurrent パッケージの javadoc を見ると、次のように表示されます。

java.util.concurrent の 5 つの実装 (LinkedBlockingQueue、ArrayBlockingQueue、SynchronousQueue、PriorityBlockingQueue、および DelayQueue) は、プットとテイクのブロッキング バージョンを定義する拡張 BlockingQueue インターフェースをサポートします。

そしてBlockingQueue明確に述べています

BlockingQueue の実装はスレッドセーフです。すべてのキューイング メソッドは、内部ロックまたはその他の形式の同時実行制御を使用して、アトミックに効果を達成します。ただし、一括コレクション操作の addAll、containsAll、retainAll、および removeAll は、実装で特に指定されていない限り、必ずしもアトミックに実行されるとは限りません。

于 2012-11-15T13:18:20.380 に答える
1

HotSpot Java 7のソースコードを読むと、と呼ばれるロックが1つだけありますlock

これはクラスの文書化された要件ではないため、さまざまな実装が可能です。

于 2012-11-15T13:17:10.537 に答える
0

PriorityBlockingQueueの Javadoc から:

クラス PriorityQueue と同じ順序付け規則を使用し、ブロッキング取得操作を提供する無制限のブロッキング キュー。このキューは論理的に無制限ですが、リソースの枯渇により追加の試行が失敗する場合があります (OutOfMemoryError が発生します)。このクラスは null 要素を許可しません。自然順序付けに依存するプライオリティ キューでは、比較不可能なオブジェクトの挿入も許可されません (これを行うと、ClassCastException が発生します)。

内部実装は無関係です。

于 2012-11-15T13:21:52.383 に答える