19 ReentrantLock如何實現鎖重入

一個線程持有鎖時,當其他的線程嘗試獲取該鎖時,會被阻塞;而這個線程嘗試獲取自己持有鎖時,如果成功說明鎖是可以重入的,反之則不可重入。
ReentrantLock使用內部類的Sync來管理鎖,所以真正的獲取鎖是由Sync的實現類來控制的。Sync又有2個實現,分別爲NonfairSync(非公平鎖)和FairSync(公平鎖)。Sync通過繼承AQS實現,在AQS中維護了一個private volatile in state 來計算重入次數,避免頻繁的持有釋放操作帶來的線程問題。
synchronized 關鍵字經過編譯後,會在同步快的前後分別形成monitorenter和monitoreit2個字節碼指令。每個鎖對象內部維護一個計時器,該計時器初始值爲0,表示任何線程都可以獲取該鎖並執行相應的方法。根據虛擬規範要求,在執行minitorenter指令時,首先嚐試獲取對象的鎖,如果這個對象沒有被鎖定,或者當前線程已經擁有了對象的鎖,把鎖的計數器+1,相應的在執行monitorexit指令後鎖計數器-1,當計數器爲0時,鎖就被釋放,如果獲取對象鎖失敗,那當前線程就要阻塞等待,直到對象鎖被另一個線程釋放爲止。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章