java - 條件變量的await()釋放鎖嗎?
問題描述
譬如下面的兩個條件變量 isEmpty和isFull當調用他們的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()的作用是能夠讓其他線程訪問競爭資源,所以掛起狀態就是要釋放競爭資源的鎖。 在javaSE5的java.util.concurrent類庫中,使用互斥并允許任務掛起的基本類就是Condition,你可以通過await()來掛起一個任務,當外部條件改變時,意味著某個任務可以繼續執行,你可以通過signal()來通知這個任務。
每個lock()的調用必須緊跟一個try-finally子句,用來保證在所有情況下都可以釋放鎖。任務在可以調用await(),signal(),signalAll()之前,必須擁有這個鎖。
相關文章:
1. 數組按鍵值封裝!2. docker不顯示端口映射呢?3. java - 阿里的開發手冊中為什么禁用map來作為查詢的接受類?4. 問題:javaBean對象如何指定部分屬性 然后轉為json字符串5. html5 - 使用echarts中的圖表 一個頁面導入了好幾個js圖表 實現echarts圖表隨著瀏覽器窗口變化而變化時出現了問題6. clone - git sourceTree克隆倉庫時,都不停彈出Password Required彈窗,即時輸入正確的git賬號密碼還是彈出7. javascript - 使用vue官方腳手架進行單元測試,如何覆蓋到watch里的變量?8. python - 如何找第三方編譯好的模塊?9. javascript - webpack中alias配置中的“@”是什么意思?10. javascript - 為什么創建多行多列的表格最后只有一行內有表格
