我有一個消費者和一個生產者,從隊列中添加和刪除Item對象。如果我使用put()
和take()
方法。我還需要覆蓋哪些線程安全問題?這與有界緩衝區問題類似,我只是想知道是否使用阻塞隊列取代了信號量或監視器的需要。 Item對象本身可能需要同步(setters,但getter不需要鎖定),對嗎?最後,我不太確定如何測試它是否是線程安全的,因爲我不能同時使兩個線程都調用take()
,因爲執行順序是不確定的。有任何想法嗎?謝謝。使用LinkedBlockingQueue足夠好用於多線程Java程序嗎?
8
A
回答
7
這對你所做的事情來說是完全線程安全的,實際上這就是它的設計目的。的BlockingQueue
的描述(其是由LinkedBlockingQueue
實現的接口)規定:
BlockingQueue實現是線程安全。所有排隊方法 使用併發控制的內部鎖或其他形式 原子地實現其效果。
1
同時put()方法,並採取()是不線程安全,因爲它們使用2個不同的鎖。
這是已經在這裏找到答案:Are LinkedBlockingQueue's insert and remove methods thread safe?
+0
我按照鏈接找到了另一篇文章的答案,解釋了爲什麼它是線程安全的。 http://stackoverflow.com/questions/26543807/is-blockingqueue-completely-thread-safe-in-java/26543940#26543940 – user1266174
相關問題
- 1. UITextView足夠用於簡單的寫作應用程序嗎?
- 2. Java:足夠易於使類進行線程安全?
- 3. 對於Windows而言,多媒體豐富的應用程序是否足夠好?
- 4. 有多少線程最好使用? (java)
- 5. 構建於ASP.NET Membership Hashing足夠好嗎?
- 6. C#多線程沒有使用足夠的CPU
- 7. 多線程在asp.net web應用程序中很好用嗎?
- 8. Java多線程程序如何能夠使用多個CPU內核?
- 9. 好或不好主意:基於Java的多用戶基於Servlet的Web應用程序中的多線程
- 10. 是std :: mutex足夠用於線程之間的數據同步
- 11. 如何在Java中使用LinkedBlockingQueue創建線程池?
- 12. 在多線程應用程序中使用類變量不好嗎?
- 13. LinkedBlockingQueue只返回多個線程之一
- 14. 關於多線程java應用程序的序列圖
- 15. 關於多線程的java多線程
- 16. Android:EXTERNAL_CONTENT_URI足夠用於照片庫嗎?
- 17. Ruby線程不夠好?
- 18. Xamarin足夠開發社交平臺應用程序嗎?
- 19. 爲了部署Play應用程序,「activator dist」足夠嗎?
- 20. 能夠在多個線程中使用嗎?
- 21. Java中的多線程應用程序?
- 22. 分析多線程Java應用程序
- 23. ImageBrush能夠工作多線程嗎?
- 24. 多線程Java應用程序是否會很好地利用多核機器?
- 25. 多路複用Java的LinkedBlockingQueue
- 26. 對於商業應用程序,html5是否足夠強大?
- 27. 對於大ajaxy應用程序是否足夠$ .empty()?
- 28. 測試iPhone應用程序時,僅使用Leaks儀器就足夠了嗎?
- 29. Lua最少公用多個程序沒有足夠的內存
- 30. PingPong程序Java多線程
雖然執行的順序是不確定的,不會有證據表明,LBQ不夠好,如果你''把()''不會出現某些項目,或者來自''take()''的結果反覆出現相同的項目項? –
我想這是一個可能的測試,但它可能並不總是一個線程特定的測試。也許在調用take()時使用線程休眠,而其他線程也調用它? – Dan
默認情況下,Executors使用的是什麼,這導致了我的問題;你不能使用一個封裝隊列和線程池的ExecutorService嗎? –