PriorityBlockingQueue
有多少把鎖? take
和put
操作是否同步? 我無法找到關於這種類型的隊列的很多信息。我正在使用單線程PriorityQueue
。我可以在多線程中使用PriorityBlockingQueue嗎?
回答
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不一定是以原子方式執行,除非在實現中另有規定。
從閱讀HotSpot Java 7源代碼,只有一個鎖,名爲lock
。
不同的實現是可能的,因爲這不是該類的文檔化要求。
從Javadoc文檔PriorityBlockingQueue:
使用相同的順序規則,類 的PriorityQueue和建築材料阻塞獲取操作一個無界阻塞隊列。雖然此隊列在邏輯上是無界的,但由於資源耗盡(導致OutOfMemoryError),嘗試添加可能會失敗。這個類不允許 許可null元素。依賴於自然排序的優先級隊列 也不允許插入不可比較的對象(這樣做導致ClassCastException中的 )。
內部實現無關緊要。
- 1. 我們可以在多線程環境中使用Hashmap嗎?
- 2. 我可以在Perl的DBI和Oracle上使用多線程嗎?
- 3. 在WinForms中,在UI中可以使用多個線程嗎?
- 4. 我可以使用太多的後臺工作線程嗎?
- 5. 我可以使用QTimer實現多線程算法嗎?
- 6. Alarm()可以像這樣在多線程中使用嗎?
- 7. 我可以在java中的線程中運行線程嗎?
- 8. 我可以在Realm的線程中使用忽略屬性嗎?
- 9. 我可以在單線程中使用兩個套接字嗎?
- 10. 我們可以在PL/SQL中使用線程嗎?
- 11. 我可以使用Python在App Enging中創建線程嗎?
- 12. 我可以在Perl中重複使用連接的線程嗎?
- 13. 我們可以在Ruby中並行運行多線程嗎?
- 14. 我可以在單線程中創建多個Lua VM嗎?
- 15. 我們可以在java中使用多線程概念和WatchService API嗎?
- 16. 我可以使用Flash製作在線多人遊戲嗎?
- 17. 我可以使用flex將分隔線放在多行上嗎?
- 18. 我們可以使用同步塊內的優先級隊列使其線程安全,而不是使用PriorityBlockingQueue
- 19. 我在2線程之間使用ConcurrentQueue可以嗎?
- 20. 我可以在我的ios應用程序中離線使用bing map api嗎?
- 21. 我可以製作標籤多線嗎?
- 22. ImageIO可以是多線程的嗎?
- 23. 我可以在非Netty線程中調用`Channel.write()`嗎?
- 24. 我可以在主線程(UI線程)之外創建UI嗎?
- 25. 我可以爲子應用程序使用透明路線嗎?
- 26. 兩個線程可以使用相同的線程程序嗎?
- 27. 我可以「強制」線程喚醒嗎?
- 28. 我們可以在多線程進程的strace輸出中獲得線程的線程ID嗎?
- 29. 我可以強制matplotlib在PyQt線程/進程中阻塞嗎?
- 30. 我可以在我的應用程序中使用多個廣告api(sdk)嗎?
http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/PriorityBlockingQueue。html – shazin
從'BlockingQueue' javadocs它說「BlockingQueue實現是線程安全的」。 – Gray
看看實際的實現,它使用java.util.concurrent.locks.ReentrantLock進行線程安全。幾乎所有的方法都是如此。 – tjg184