用reentrantlock保護**塊基本結構:
public
class
bank
finally
}}
每個bank物件都有自己的reentrantlock物件。訪問不同的bank物件,會得到不同的鎖物件。
鎖是可重入的,獲得鎖的執行緒可以重複獲得相同的鎖,呼叫其他使用相同鎖的方法,鎖用乙個持有計數來跟蹤對lock方法的巢狀呼叫。
執行緒進入臨界區,發現需要某條件滿足後才能執行。需要使用乙個條件物件來管理獲得鎖但無法執行的執行緒。
乙個鎖物件可以有乙個或多個相關的條件物件,使用newcondition方法獲得乙個條件物件。
condition.await(); 執行緒阻塞,放棄鎖,進入該條件的等待集
condition.signalall(); 喚醒所有等待該條件的執行緒,解除阻塞狀態,執行緒試圖重新獲得鎖
class
bank
public
void
transfer
(int from,
int to,
int amount)
throws interruptedexception
finally
}}
執行緒呼叫lock方法獲取另一線程持有的鎖時,很可能發生阻塞。
trylock方法試圖申請乙個鎖,若成功獲得鎖則返回true,否則返回false,執行緒可以立即離開去做其他事情。
if
(mylock.
trylock()
)finally
}else
呼叫trylock時,可以使用超時引數
if
(mylock.
trylock
(100
, timeunit.milliseconds)
)
或呼叫lockinterruptibly方法,相當於超時引數設為無限。
lock方法不能被中斷。如果乙個執行緒在等待獲得鎖時被中斷(interrupt()),中斷執行緒在獲得鎖之前會一直處於阻塞狀態。若出現死鎖,lock方法就無法終止。
如果呼叫的是帶有超時引數的trylock或lockinterruptibly,若執行緒在進入此方法前或在等待鎖期間被中斷會丟擲interruptedexception異常。允許程式打破死鎖。
等待乙個條件時,也可以設定超時引數
mycondition.
await
(100
, timeunit.millseconds)
;
當執行緒被另乙個執行緒的signalall或signal啟用,或超時時限達到,或執行緒被中斷時,await方法將返回。當等待的執行緒被中斷時,會丟擲interruptedexception異常。 多執行緒 互斥物件和鎖
互斥物件的主要操作有兩個,即加鎖 lock 和解鎖 unlock 當乙個執行緒對互斥物件進行lock操作並成功獲得這個互斥物件的所有權,在此執行緒對此物件unlock前,其他執行緒對這個互斥物件的lock操作都會被阻塞。有些傾向需要對多個互斥物件進行加鎖,考慮下面的 std mutex mt1,mt...
Java多執行緒 類鎖和物件鎖
我們設想某個執行緒獨佔某個類,必須執行完才能再次建立物件 預期輸出以下結果 物件鎖示例 關鍵字synchronized取得的鎖都是物件鎖,而不是把一段 方法 當做鎖,所以 中哪個執行緒先執行synchronized關鍵字的方法,哪個執行緒就持有該方法所屬物件的鎖 lock 在靜態方法上加synchr...
多執行緒的物件鎖和類鎖
今天面試官問了乙個問題,如果在乙個類中的普通方法加上synchronized 關鍵字,兩個執行緒可以同步方法這個方法嗎?為什麼 當時回答是不可以同步,然後面試官確認我說一定嗎?當時就知道回答錯了。現在實現了下,原來是類鎖和物件鎖的區別所在,也算是普及了下相關知識吧。類鎖 就是在方法前面加上 stat...