java - 条件变量的await()释放锁吗?
高洛峰
高洛峰 2017-04-18 10:48:30
0
2
1453

譬如下面的两个条件变量 isEmpty和isFull
当调用他们的await()时,lock.lock()上的锁会被释放吗?

这里有3个对象,一个i哦是lock,一个是isEmpty,一个是isFull
上锁的对象是lock,而不是isEmpty或者isFull
那isFull或者isEmpty释放的锁确实lock上的?

private volatile boolean usedData = true;//mutex for data
private final Lock lock = new ReentrantLock();
private final Condition isEmpty = lock.newCondition();
private final Condition isFull = lock.newCondition();

public void setData(int data) throws InterruptedException {
    lock.lock();
    try {
        while(!usedData) {//wait for data to be used
            isEmpty.await();
        }
        this.data = data;
        isFull.signal();//broadcast that the data is now full.
        usedData = false;//tell others I created new data.          
    }finally {
        lock.unlock();//interrupt or not, release lock
    }       
}
高洛峰
高洛峰

拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...

全部回覆(2)
迷茫

await的doc有這麼一句啊The lock associated with this Condition is atomically released

Ty80

謝邀,
答案:

会;
是;

await()的作用是能夠讓其他執行緒存取競爭資源,所以掛起狀態就是要釋放競爭資源的鎖。 在java
SE5的java.util.concurrent類別庫中,使用互斥並允許任務掛起的基本類別就是Condition,你可以透過await()來掛起一個任務,當外部條件改變時,意味著某個任務可以繼續執行,你可以透過signal()來通知這個任務。

每個lock()的呼叫必須緊跟著一個try-finally子句,用來確保在所有情況下都可以釋放鎖定。 任務在可以呼叫await(),signal(),signalAll()之前,必須擁有這個鎖。

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板