java - 條件變量的await()釋放鎖嗎?
問(wèn)題描述
譬如下面的兩個(gè)條件變量 isEmpty和isFull當(dāng)調(diào)用他們的await()時(shí),lock.lock()上的鎖會(huì)被釋放嗎?
這里有3個(gè)對(duì)象,一個(gè)i哦是lock,一個(gè)是isEmpty,一個(gè)是isFull上鎖的對(duì)象是lock,而不是isEmpty或者isFull那isFull或者isEmpty釋放的鎖確實(shí)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 } }
問(wèn)題解答
回答1:await的doc有這么一句啊The lock associated with this Condition is atomically released
回答2:謝邀,答案:
會(huì);是;
await()的作用是能夠讓其他線程訪問(wèn)競(jìng)爭(zhēng)資源,所以掛起狀態(tài)就是要釋放競(jìng)爭(zhēng)資源的鎖。 在javaSE5的java.util.concurrent類庫(kù)中,使用互斥并允許任務(wù)掛起的基本類就是Condition,你可以通過(guò)await()來(lái)掛起一個(gè)任務(wù),當(dāng)外部條件改變時(shí),意味著某個(gè)任務(wù)可以繼續(xù)執(zhí)行,你可以通過(guò)signal()來(lái)通知這個(gè)任務(wù)。
每個(gè)lock()的調(diào)用必須緊跟一個(gè)try-finally子句,用來(lái)保證在所有情況下都可以釋放鎖。任務(wù)在可以調(diào)用await(),signal(),signalAll()之前,必須擁有這個(gè)鎖。
相關(guān)文章:
1. 我在導(dǎo)入模板資源時(shí)遇到無(wú)法顯示的問(wèn)題,請(qǐng)老師解答下2. python - 調(diào)用api輸出頁(yè)面,會(huì)有標(biāo)簽出現(xiàn),請(qǐng)問(wèn)如何清掉?3. thinkphp6使用驗(yàn)證器 信息如何輸出到前端頁(yè)面4. javascript - h5微信中怎么禁止橫屏5. PHPExcel表格導(dǎo)入數(shù)據(jù)庫(kù)怎么導(dǎo)入6. 運(yùn)行python程序時(shí)出現(xiàn)“應(yīng)用程序發(fā)生異常”的內(nèi)存錯(cuò)誤?7. macos - 無(wú)法source activate python278. python - sqlalchemy更新數(shù)據(jù)報(bào)錯(cuò)9. empty比isset更嚴(yán)格一點(diǎn)10. 預(yù)訂金和尾款分別支付

網(wǎng)公網(wǎng)安備