2012-11-15 38 views
4

PriorityBlockingQueue有多少把鎖? takeput操作是否同步? 我無法找到關於這種類型的隊列的很多信息。我正在使用單線程PriorityQueue我可以在多線程中使用PriorityBlockingQueue嗎?

+0

http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/PriorityBlockingQueue。html – shazin

+1

從'BlockingQueue' javadocs它說「BlockingQueue實現是線程安全的」。 – Gray

+0

看看實際的實現,它使用java.util.concurrent.locks.ReentrantLock進行線程安全。幾乎所有的方法都是如此。 – tjg184

回答

12

PriorityBlockingQueue有多少個鎖?

這是一個無關緊要的實現細節。除非你想了解它是如何實現的,在這種情況下,我只能建議你看看源代碼。

取放操作是否同步?

它們可能不嚴格同步,但類是線程安全的,因此您可以同時在多個線程中進行並行操作。

注:PriorityBlockingQueue的Javadoc是不是在這一點上非常明確的,但如果你看看at the javadoc of the java.util.concurrent package,您將看到:

五實現java.util.concurrent中支持擴展的BlockingQueue接口,定義阻止put和take的版本:LinkedBlockingQueue,ArrayBlockingQueue,SynchronousQueue,PriorityBlockingQueue和DelayQueue。

而且BlockingQueue clearly states

BlockingQueue實現是線程安全的。所有排隊方法都使用內部鎖或其他形式的併發控制自動實現其效果。但是,批量操作addAll,containsAll,retainAll和removeAll不一定是以原子方式執行,除非在實現中另有規定。

1

從閱讀HotSpot Java 7源代碼,只有一個鎖,名爲lock

不同的實現是可能的,因爲這不是該類的文檔化要求。

0

從Javadoc文檔PriorityBlockingQueue

使用相同的順序規則,類 的PriorityQueue和建築材料阻塞獲取操作一個無界阻塞隊列。雖然此隊列在邏輯上是無界的,但由於資源耗盡(導致OutOfMemoryError),嘗試添加可能會失敗。這個類不允許 許可null元素。依賴於自然排序的優先級隊列 也不允許插入不可比較的對象(這樣做導致ClassCastException中的 )。

內部實現無關緊要。

相關問題