#頭條創作挑戰賽# 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,才代表解鎖成功
以上就是可重入鎖的加鎖與解鎖