這取決於實施。如果不同產品有單獨的隊列,則每個隊列必須使用單獨的鎖對象(此鎖對象可能是隊列本身)進行保護。
另外它取決於你是否正在編寫隊列的實現,那麼你可能會決定把Lock對象作爲一個私有變量。另外,您可以檢查隊列是否已滿,您可能會選擇在專用鎖變量上使用wait
。一旦消耗了任何對象,就可以在私有鎖對象上調用notifyall
(或notify
,儘管notifyall
是可取的)。類似的,如果消費者調用方法在隊列爲空時從隊列中提取元素,則可以使用wait
和notify
邏輯。這樣你的隊列類將負責使用私有變量對象進行鎖定和通知。由於隊列具有私有變量lovk對象,因此每個隊列實例都有自己獨立的Lock對象。
其他方式是,如果隊列是通用隊列,可能不是你正在編寫隊列,那麼你需要保護調用添加和讀取方法的代碼。如果你爲不同的產品(x,y等)分開排隊,那麼你需要爲每個隊列使用不同的Lock對象。這是防止死鎖所必需的,它可能發生(如果我們沒有sepatrate鎖對象),consumerX正在等待queueX插入一個元素(因爲它是空的),而另一個producerY沒有機會插入queueY(因爲它的充分)。因此你需要單獨的鎖定對象。
更新
@TheCoder如果只有一個生產者和消費者在同類型產品中都intrested那麼一個隊列就可以了。現在來了兩個應該交流的共享對象的問題。這取決於實現,如果你希望Queue處理它,Queue可以有一個私人字段private Object monitor = new Object();
,並且可以使enqueue
和dequeue
方法在`monitor'上同步。
dequeue
方法如果隊列爲空,則在while
循環內調用monitor.wait()
,直到隊列爲空。如果隊列不爲空,則從隊列中刪除對象並調用monitor.notifyAll();
enqueue
如果隊列已滿,則調用monitor.wait()
中的while循環直到隊列滿。如果隊列是不是滿的,則在隊列中添加一個對象,然後調用monitor.notifyAll();
如果你的實現是這樣的,你想排隊不照顧同步化的,那麼你應該有一個共同的目標上Producrer
和Consumer
可以調用enqueue
之前同步和dequeue
在queue
。這個共享對象可以是queue
本身的實例。將需要在共享對象的同步塊內調用wait
和notifyAll
。
通常情況下,您使用併發隊列實現來處理鎖定(安全發佈,實際上)以及事物的通知方面。 – BeeOnRope
我試圖進行的任務是教我多線程,因此我沒有使用併發包中的任何東西。 – TheCoder
你的問題不清楚。如果您有不同的對象類型和不同的使用者,請使用兩個隊列。也許你應該把問題分解成至少兩個問題:一個側重於如何構建一個併發隊列,另一個是關於讓不同的生產者/消費者類型與一個隊列交互的想法。他們似乎與我正交。 – BeeOnRope