偏向锁的撤销
偏向鎖的撤銷并不是把對象恢復到無鎖可偏向狀態(tài)(因為偏向鎖并不存在鎖釋放的概念),而是在獲取偏向鎖的過程中,發(fā)現(xiàn)cas失敗也就是存在線程競爭時,直接把被偏向的鎖對象升級到被加了輕量級鎖的狀態(tài)。?
對原持有偏向鎖的線程進行撤銷時,原獲得偏向鎖的線程有兩種情況:?
1. 原獲得偏向鎖的線程如果已經退出了臨界區(qū),也就是同步代碼塊執(zhí)行完了,那么這個時候會把對象頭設置成無鎖狀態(tài)并且爭搶鎖的線程可以基于CAS重新偏向但前線程?
2. 如果原獲得偏向鎖的線程的同步代碼塊還沒執(zhí)行完,處于臨界區(qū)之內,這個時候會把原獲得偏向鎖的線程升級為輕量級鎖后繼續(xù)執(zhí)行同步代碼塊?
在我們的應用開發(fā)中,絕大部分情況下一定會存在2個以上的線程競爭,那么如果開啟偏向鎖,反而會提升獲取鎖的資源消耗。所以可以通過jvm參數(shù)UseBiasedLocking?來設置開啟或關閉偏向鎖
流程圖分析
?
?
總結
- 上一篇: 偏向锁的获取和撤销逻辑
- 下一篇: 轻量级锁的加锁和解锁逻辑