| 對於初學者來說,執
行緒的同步化 並非是個容易理解的議題,在synchronized中隱含著物件鎖定與釋放鎖定的觀念,程式中並沒有明顯的語意來告知這一點,而必須靠程式設計人員本身記憶物件的鎖定與釋放鎖定問題。 在java.util.concurrent.locks套件中新增了Lock與Condition等類別,可以讓您明確的在程式中進行明確的鎖定與釋放鎖定。 Lock是一個介面,其中規範了lock()、unclock()與newCondition()三種方法:
用來取得物件的鎖定。
用來釋放物件的鎖定,通常由同一個Lock物件來呼叫lock()與unlock()。
建立一個與Lock物件相關聯的Conditon物件。
Condition是一個介面,作用是在執行緒之間進行溝通,就如其名稱所示,告知執行緒目前的狀況為何,是要等待?還是通知?其規範的幾個重要方法為:
告知目前的執行緒等待,直到被通知或中斷(interrupted)。
通知目前等待中的一個執行緒,從上次的等待點繼續執行,類似物件的notify()方法
通知目前等待中的所有執行緒參與鎖定競爭,而後從上次的等待點繼續執行,類似物件的notifyAll()方法。
在這邊直接改寫wait ()、notify() 中的Clerk類別,不使用synchronized、wait()、notify(),而改用Lock與Condition,其中ReentrantLock為Lock介面的一個實作類別:
import java.util.concurrent.locks.*; |