1

我試圖模擬Java中的情況,其中許多生產者(至少2個)以固定速率訪問相同的LinkedBlockingQueue。他們製作,放置,然後重新開始。 我在想這是否會最終導致那些試圖在同一時間獲得隊列寫權限的生產者之間的競爭條件。是否已經設置了java.util.concurrent.BlockingQueue的實現來處理這樣的問題,還是應該手動創建互斥以避免這類問題?LinkedBlockingQueue與生產者 - 消費者場景中的許多生產者的線程安全

感謝您的關注。

+2

所有BlockingQueues都是線程安全的。 – assylias

+1

「請注意,BlockingQueue可以安全地與多個生產者和多個消費者一起使用。」來自http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/BlockingQueue.html – Fildor

回答

1

Java的阻塞隊列線程安全的單一操作如拿放,但不具有多個操作看跌的或採取諸如不被原子方式執行addAll操作。

所以在你的情況下,答案是否定的,你不應該自己處理線程安全,除非你希望生產者生產多種產品並把它們全部放在一個操作中。

+0

謝謝您的回覆。當訪問單個操作的阻塞隊列時,是否還缺省提供了一個飢餓避免機制? – pr0gma

+1

可能無助於您的情況,但ArrayBlockingQueue具有可在構造函數中設置的公平標誌。這保證了阻塞操作以FIFO順序進行服務,這可以防止飢餓。 – brettw