多執行緒 鎖物件和條件物件

2021-09-11 16:02:47 字數 1444 閱讀 2907

用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...