java - 條件變量的await()釋放鎖嗎?
問題描述
譬如下面的兩個條件變量 isEmpty和isFull當(dāng)調(diào)用他們的await()時,lock.lock()上的鎖會被釋放嗎?
這里有3個對象,一個i哦是lock,一個是isEmpty,一個是isFull上鎖的對象是lock,而不是isEmpty或者isFull那isFull或者isEmpty釋放的鎖確實lock上的?
private volatile boolean usedData = true;//mutex for dataprivate 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 } }
問題解答
回答1:await的doc有這么一句啊The lock associated with this Condition is atomically released
回答2:謝邀,答案:
會;是;
await()的作用是能夠讓其他線程訪問競爭資源,所以掛起狀態(tài)就是要釋放競爭資源的鎖。 在javaSE5的java.util.concurrent類庫中,使用互斥并允許任務(wù)掛起的基本類就是Condition,你可以通過await()來掛起一個任務(wù),當(dāng)外部條件改變時,意味著某個任務(wù)可以繼續(xù)執(zhí)行,你可以通過signal()來通知這個任務(wù)。
每個lock()的調(diào)用必須緊跟一個try-finally子句,用來保證在所有情況下都可以釋放鎖。任務(wù)在可以調(diào)用await(),signal(),signalAll()之前,必須擁有這個鎖。
相關(guān)文章:
1. linux - Ubuntu下編譯Vim8(+python)無數(shù)次編譯失敗2. java - 在搭建ssm的過程中 用junit測試Dao層 怎么樣都報錯 說連接不上jdbc3. javascript - 如何判斷用戶切換到了當(dāng)前標(biāo)簽頁?4. java - Mybatis關(guān)聯(lián)查詢5. css - 移動端 盒子內(nèi)加overflow-y:scroll后 字體會變大6. java - 新手做一個安卓視頻播放器,想實現(xiàn)一個進度條,按鈕那種在視頻下方懸浮的功能,不知道思路!7. javascript - webpack 報錯 新人 求解8. javascript - H5頁面怎么查看console信息?9. nginx 80端口反向代理多個域名,怎樣隱藏端口的?10. 前端 - CSS3 box-shadow如何設(shè)置,或者用什么方法可以產(chǎn)生圖中這樣陰影的效果。
