Java7併發程式設計--2、鎖中使用多條件condition
阿新 • • 發佈:2019-02-20
在lock中提供了與之關聯的條件,一個鎖可能關聯一個或多個條件,這些條件通過condition介面宣告。目的是執行執行緒獲取鎖並且檢視等待某一個條件是否滿足,如果不滿足則掛起直到某個執行緒喚醒它們。condition介面提供了掛起執行緒和喚起執行緒的機制;
介紹下下面一堆程式碼所做的事情:使用了5個執行緒設定(生產)一個數值,使用5個執行緒移除(消費)這個數值;
在add 和 remoe中使用Condition來代替監視器鎖的wait操作和喚醒操作。
值得注意的是:
1. 讀寫執行緒數量如果不對等,將會出現死鎖。
2. 所有的條件Condition必須使用對等的鎖物件來建立lock.newCondition();
3. 條件必須用在lock() 和 unlock() 方法之間。
4. 在判定條件是否滿足,需要在迴圈中判定,未滿足條件的不能離開迴圈體,否則資料將得不到我們想要的結果
介紹下下面一堆程式碼所做的事情:使用了5個執行緒設定(生產)一個數值,使用5個執行緒移除(消費)這個數值;
在add 和 remoe中使用Condition來代替監視器鎖的wait操作和喚醒操作。
值得注意的是:
1. 讀寫執行緒數量如果不對等,將會出現死鎖。
2. 所有的條件Condition必須使用對等的鎖物件來建立lock.newCondition();
3. 條件必須用在lock() 和 unlock() 方法之間。
4. 在判定條件是否滿足,需要在迴圈中判定,未滿足條件的不能離開迴圈體,否則資料將得不到我們想要的結果
5. 呼叫await()方法進入休眠的執行緒可能會被中斷,所以必須處理InterruptedException 異常
程式執行結果:可以看出以上的結果:有值了,才能被取走,被取走了,才能被生產一個值。
ReentrantLock和ReentrantReadWriteLock(有兩種鎖:一種為讀操作鎖,通過ReadWriteLock介面的readLock()方法獲取,寫操作鎖通過ReadWriteLock介面的writeLock()方法獲取。)類構造器都有一個布林引數fair,預設為false,即非公平狀態,當很多執行緒在等待鎖時,隨機選擇一個來訪問臨界區,若fair值為true,則成為公平模式,選擇的是等待時間最長的執行緒。