synchronized的執行過程:
1. 檢測Mark Word里面是不是當前線程的ID,如果是,表示當前線程處於偏向鎖
2. 如果不是,則使用CAS將當前線程的ID替換Mard Word,如果成功則表示當前線程獲得偏向鎖,置偏向標志位1
3. 如果失敗,則說明發生競爭,撤銷偏向鎖,進而升級為輕量級鎖。
4. 當前線程使用CAS將對象頭的Mark Word替換為鎖記錄指針,如果成功,當前線程獲得鎖
5. 如果失敗,表示其他線程競爭鎖,當前線程便嘗試使用自旋來獲取鎖。
6. 如果自旋成功則依然處於輕量級狀態。
7. 如果自旋失敗,則升級為重量級鎖。
上面幾種鎖都是JVM自己內部實現,當我們執行synchronized同步塊的時候jvm會根據啟用的鎖和當前線程的爭用情況,決定如何執行同步操作;
在所有的鎖都啟用的情況下線程進入臨界區時會先去獲取偏向鎖,如果已經存在偏向鎖了,則會嘗試獲取輕量級鎖,啟用自旋鎖,如果自旋也沒有獲取到鎖,則使用重量級鎖,沒有獲取到鎖的線程阻塞掛起,直到持有鎖的線程執行完同步塊喚醒他們;
偏向鎖是在無鎖爭用的情況下使用的,也就是同步開在當前線程沒有執行完之前,沒有其它線程會執行該同步塊,一旦有了第二個線程的爭用,偏向鎖就會升級為輕量級鎖,如果輕量級鎖自旋到達閾值后,沒有獲取到鎖,就會升級為重量級鎖;