當某個執行緒想要請求乙個被其他執行緒持有的鎖時,就只能進入阻塞狀態,等待著這個鎖被釋放
但是設想一下,如果這個鎖是被這個執行緒自己持有,然後這個執行緒再此請求獲取這個鎖,還是會被阻塞麼?
答案是:不會,該請求能夠成功
這就是可重入鎖的乙個簡單理解,可以重入意味著我們對持有鎖的判斷依據是執行緒,乙個執行緒能夠獲取由它自己所持有的鎖。
可重入鎖的簡單實現邏輯:
為每乙個鎖關聯乙個持有者執行緒和計數值,當計數值為0時,意味著這個鎖沒有被任何執行緒持有,而如果有執行緒請求獲取乙個沒有被持有的鎖,jvm會把這個執行緒記錄下來作為持有者執行緒,同時計數值加一,如果是相同的執行緒再次獲取鎖,那麼這個計數值會繼續加一,當執行緒退出同步**塊時,計數值就會減一,當減到0時,這個鎖就會被釋放。
下面使用synchronized關鍵字簡單演示下可重入鎖:
/**
* 動物類
*/public
class
animal
}
/**
* 獅虎獸類
*/public
class
ligeranimal
extends
animal
}
呼叫子類的方法做測試:
public
static
void
main
(string[
] args)
throws exception
可以看到子類繼承了父類,重寫了父類的方法,然後呼叫父類的方法。
子類和父類方法都加了synchronized關鍵字,所以在呼叫dosomething()方法時,都會去獲取animal上的鎖,如果鎖不可以重入,那麼在子類呼叫dosomething()時,持有了鎖,輸出完"子類獅虎獸做點事",就無法再繼續呼叫父類的dosomething()了,因為super.dosomething()無法再獲取animal上的鎖,這個鎖已經被子類呼叫時被持有了,執行緒將永遠停頓下去,因為執行不完**,執行緒退出不了同步塊,而真實情況是:
子類父類的方法都能輸出
可重入鎖 不可重入鎖
可重入鎖指的是可重複可遞迴呼叫的鎖,在外層使用鎖之後,在內層仍然可以使用,並且不發生死鎖 前提是同乙個物件或者類 note reentrantlock和synchronized都是可重入鎖 1 public class testlock 78 public synchronized void tes...
可重入鎖和不可重入鎖
當乙個執行緒獲得當前例項的鎖lock,並且進入了方法a,該執行緒在方法a沒有釋放該鎖的時候,是否可以再次進入使用該鎖的方法b?不可重入鎖 在方法a釋放鎖之前,不可以再次進入方法b 可重入鎖 在方法a釋放該鎖之前可以再次進入方法b 如reentrantlock和synchronized 不可重入鎖的實...
可重入鎖和不可重入鎖
可重入鎖就是可以迴圈迭代使用的鎖,不會產生死鎖的現象,典型的就是synchronized和reentrantlock。不可重入鎖迴圈迭代使用則有產生死鎖的風險。可重入鎖 class reentranttest implements runnable public synchronized void ...