2012-09-26 45 views
8

我有一個消費者和一個生產者,從隊列中添加和刪除Item對象。如果我使用put()take()方法。我還需要覆蓋哪些線程安全問題?這與有界緩衝區問題類似,我只是想知道是否使用阻塞隊列取代了信號量或監視器的需要。 Item對象本身可能需要同步(setters,但getter不需要鎖定),對嗎?最後,我不太確定如何測試它是否是線程安全的,因爲我不能同時使兩個線程都調用take(),因爲執行順序是不確定的。有任何想法嗎?謝謝。使用LinkedBlockingQueue足夠好用於多線程Java程序嗎?

+0

雖然執行的順序是不確定的,不會有證據表明,LBQ不夠好,如果你''把()''不會出現某些項目,或者來自''take()''的結果反覆出現相同的項目項? –

+0

我想這是一個可能的測試,但它可能並不總是一個線程特定的測試。也許在調用take()時使用線程休眠,而其他線程也調用它? – Dan

+0

默認情況下,Executors使用的是什麼,這導致了我的問題;你不能使用一個封裝隊列和線程池的ExecutorService嗎? –

回答

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

相關問題