我正在閱讀有關條件java.util.concurrent.locks.Condition
。條件給每個對象有多個等待集的效果?
條件因素出對象監視器方法(等待,通知和notifyAll的)>到不同的對象,得到具有多個 等待集的每個對象,通過將它們與使用任意鎖定 實現組合的效果。
有人可以解釋我嗎?
這是超過正常同步塊或方法的好處嗎?
我正在閱讀有關條件java.util.concurrent.locks.Condition
。條件給每個對象有多個等待集的效果?
條件因素出對象監視器方法(等待,通知和notifyAll的)>到不同的對象,得到具有多個 等待集的每個對象,通過將它們與使用任意鎖定 實現組合的效果。
有人可以解釋我嗎?
這是超過正常同步塊或方法的好處嗎?
例如,對於有界的DataStructure,可以使條件「notEmpty」和「notFull」等待它們。只是一個例子。看看示例here。
一個鎖可以與許多條件相關聯。鎖是一個「對象」,每個條件是一個「等待設置」。這允許獨立條件共享關鍵部分。例如,考慮有界生產者 - 消費者問題。解決這個問題的一個方法是擁有一個保護隊列的鎖和兩個獨立的等待集:一個用於生產者,等待插槽將物品放入隊列中,另一個用於等待物品消費的消費者。使用普通的舊和wait/notify
API,最好的,我們能做的就是沿着這些線路:
製片人:
synchronized (lock) {
while (queue.isFull()) {
lock.wait();
}
queue.put(sth);
lock.notify();
}
消費者:
synchronized (lock) {
while (queue.isEmpty() {
lock.wait();
}
product = queue.take();
lock.notify();
}
其缺點喚醒生產者和消費者每變化添加到隊列中,即使它不可能允許給定線程繼續(例如,當其他消費者從隊列中取出物品時,消費者就會醒來)。使用鎖定/條件API,我們可以實現分離等待消費者和生產者的解決方案,從而減少冗餘喚醒和檢查:
Lock lock = new ReentrantLock();
Condition hasPlace = lock.newCondition();
Condition hasItems = lock.newCondition();
製片人:
lock.lock();
try {
while (queue.isFull()) {
hasPlace.await();
}
queue.put(sth);
hasItems.signal();
} finally {
lock.unlock();
}
消費者:
lock.lock();
try {
while (queue.isEmpty()) {
hasItems.await();
}
product = queue.take();
hasPlace.signal();
} finally {
lock.unlock();
}
這樣,消費者等待生產者生產一些物品(hasItems條件),並且當從隊列中移除物品時,它通知生產者存在空插槽(hasPlace條件)。這兩個條件都與同一個關鍵部分(鎖定)相關聯,所以我們保持通常的排除和釋放鎖定等待保證,同時獲得分離等待隊列的能力。
有一個「)」在你的消費者失蹤「,而」:) :) – Fildor
謝謝,編輯:) –
此前,明確鎖定之前我們使用的對象wait()
和notify()
方法使線程等待,直到發生了一些事件,然後使用notify()
和對象的互斥體必須與線程中調用這些方法觸發它們。
所以每個鎖對象只有一個等待集。等待設置是存儲對象上線程wait()
的線程集(不是常規的)。
但是,對於使用單鎖的顯式鎖定框架,您可以爲與同一個鎖相關的不同條件創建多個等待集。正如Javadoc中的例子也解釋了同樣的事實。
Multiple Conditions == Multiple Wait sets
final Lock lock = new ReentrantLock(); //Single Lock
final Condition notFull = lock.newCondition(); //Multiple conditions
final Condition notEmpty = lock.newCondition();
,以便在緩衝例如從JavaDoc消費者線程的情況下,將等待條件的緩衝區是不是空的和生產者線程將等待上沒有滿的情況。
[This](http://www.baptiste-wicht.com/2010/09/java-concurrency-part-5-monitors-locks-and-conditions/)應該有所幫助。 –