來自這里的 Java 檔案https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/locks/Condition.html
我試圖理解條件概念。在下面的代碼中, put 和 take 都在同一個 Lock 上等待。檔案說在呼叫任何 condition.await() 之前,我們需要獲取相應的鎖(here line 2 : final Lock lock = new ReentrantLock();).
我的問題是,假設緩沖區已滿。在這種情況下,如果我們嘗試插入一個物件,該執行緒將被阻塞,直到count == items.length這里的鎖仍然保留在試圖放置的執行緒中。我們如何呼叫方法 take() 來減少計數,因為 take() 需要獲取同一個 Lock 的保持。在我看來,這將是死鎖,因為無法呼叫 take(),同樣,如果專案為空,我們將無法呼叫 put(),因為現在鎖已經使用 take()。
如果我遺漏了什么,請幫助我理解。提前致謝。
class BoundedBuffer {
final Lock lock = new ReentrantLock();
final Condition notFull = lock.newCondition();
final Condition notEmpty = lock.newCondition();
final Object[] items = new Object[100];
int putptr, takeptr, count;
public void put(Object x) throws InterruptedException {
lock.lock();
try {
while (count == items.length)
notFull.await();
items[putptr] = x;
if ( putptr == items.length) putptr = 0;
count;
notEmpty.signal();
} finally {
lock.unlock();
}
}
public Object take() throws InterruptedException {
lock.lock();
try {
while (count == 0)
notEmpty.await();
Object x = items[takeptr];
if ( takeptr == items.length) takeptr = 0;
--count;
notFull.signal();
return x;
} finally {
lock.unlock();
}
}
}
uj5u.com熱心網友回復:
如果您查看 Condition#await 的 api 檔案(https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/locks/Condition.html),它說:
與此 Condition 關聯的鎖被自動釋放,當前執行緒因執行緒調度目的而被禁用并處于休眠狀態,直到發生以下四種情況之一:
由于鎖定被釋放,因此 put 獲取鎖定沒有問題。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/340835.html
