天天看點

#頭條創作挑戰賽#ReentrantLock是可重入鎖,是怎麼實作的?幾張源碼圖看明白可重入鎖代表目前線程加鎖成功後,執

作者:JAVA面試官

#頭條創作挑戰賽# ReentrantLock是可重入鎖,是怎麼實作的?幾張源碼圖看明白

可重入鎖代表目前線程加鎖成功後,執行任務過程中,需要加鎖的時候,依然可以再去拿到鎖。

ReentrantLock公平鎖和非公平鎖都是繼承自AQS,加鎖的代碼 acquire(1) ,是通過改變 int 類型 state 變量,變量+1代表加一次鎖,state初始值為0。

具體實作看第一張圖

第一次加鎖成功,state變量:0-->1,同時鎖會記住目前線程。

第二次嘗試加鎖,會比較線程名字,如果是同一線程,那麼state此時會:1-->2。

第三次加鎖,同樣的,state:2-->3。

依此循環,可以出現N次加鎖。

加鎖可重入,解鎖有什麼注意事項呢?看第二張圖

解鎖 tryRelease , 每次 release(1)

對于重入過的鎖,state肯定大于1

那麼真正解鎖成功,state是需要為0的

理論上,加一次鎖,就會解一次鎖,對應+1,-1

是以 release(1)不代表解鎖成功,隻有在state=0的時候,free=true,才代表解鎖成功

以上就是可重入鎖的加鎖與解鎖

#頭條創作挑戰賽#ReentrantLock是可重入鎖,是怎麼實作的?幾張源碼圖看明白可重入鎖代表目前線程加鎖成功後,執
#頭條創作挑戰賽#ReentrantLock是可重入鎖,是怎麼實作的?幾張源碼圖看明白可重入鎖代表目前線程加鎖成功後,執
#頭條創作挑戰賽#ReentrantLock是可重入鎖,是怎麼實作的?幾張源碼圖看明白可重入鎖代表目前線程加鎖成功後,執

繼續閱讀