
騰訊面試官必問synchronized底層實現原理鎖升級完整流程一次講透面試不再卡殼前言Java后端面試synchronized絕對是JVM高頻重災區。很多開發只會說synchronized是Java內置互斥鎖保證線程安全。面試官繼續追問鎖存在哪里對象頭存儲什么偏向鎖→輕量級鎖→重量級鎖完整升級流程什么時候發生鎖降級自旋是什么一大半人思路混亂概念混淆直接扣分。本文基于HotSpot JVM完整講解synchronized底層原理、對象頭Mark Word結構、鎖升級全過程區分各類鎖適用場景整理面試標準答案開發并發場景也能學以致用。一、基礎認知synchronized使用形式三種用法本質都是鎖定對象修飾實例方法鎖當前實例對象this修飾靜態方法鎖類的Class對象修飾代碼塊鎖自定義傳入的任意對象核心鎖是對象不是代碼二、鎖信息存在哪里對象頭 Mark WordHotSpot中Java對象在內存分為三部分對象頭、實例數據、對齊填充。鎖狀態、線程信息、GC標記全部存放在對象頭的 Mark Word。Mark Word是實現synchronized鎖機制的核心。Mark Word核心存儲內容對象hashCodeGC分代年齡鎖標志位、鎖狀態偏向線程ID、偏向時間戳輕量級鎖鎖記錄指針鎖標志位區分5種狀態無鎖、偏向鎖、輕量級鎖、重量級鎖、GC標記。三、synchronized底層實現原理1. 字節碼層面同步代碼塊編譯后生成monitorenter、monitorexit指令monitorenter獲取鎖嘗試獲取對象監視器Monitormonitorexit釋放鎖注意會生成至少兩個monitorexit保證異常情況下鎖也能釋放。2. 底層操作系統層面重量級鎖依托操作系統內核態的Mutex互斥量實現。線程阻塞/喚醒需要用戶態與內核態切換開銷較大這也是重量級鎖性能低下的根源。而偏向鎖、輕量級鎖是JVM在用戶態實現的優化不依賴操作系統互斥量。四、鎖升級完整流程重點面試必考JDK1.6引入鎖優化為降低鎖開銷synchronized會根據競爭情況逐步升級升級順序無鎖 → 偏向鎖 → 輕量級鎖 → 重量級鎖??重要特性鎖只能升級不能降級階段1偏向鎖無競爭場景優化適用場景只有一條線程持續訪問同步代碼幾乎不存在多線程競爭線程第一次獲取鎖JVM將當前線程ID記錄在Mark Word中后續該線程再次獲取鎖只需要簡單校驗線程IDCAS操作無需額外同步不需要自旋開銷極低。偏向鎖撤銷條件當第二條線程嘗試競爭偏向鎖時觸發偏向鎖撤銷需要全局安全點STW偏向鎖失效升級為輕量級鎖。默認程序啟動有延遲不會立刻開啟偏向鎖。階段2輕量級鎖少量線程交替競爭競爭不激烈適用場景多線程交替執行同步代碼同一時刻很少并發競爭線程在棧幀創建鎖記錄Lock Record空間通過CAS嘗試將對象Mark Word指針指向鎖記錄CAS成功線程持有輕量級鎖執行代碼CAS失敗代表存在競爭線程進行自旋循環重試獲取鎖自旋本質不讓線程直接阻塞希望快速等到鎖釋放避免內核態切換開銷。輕量級鎖膨脹升級重量級鎖時機自旋多次仍然獲取不到鎖JDK1.6自適應自旋輕量級鎖升級為重量級鎖。階段3重量級鎖大量線程并發競爭底層依托對象的Monitor監視器操作系統Mutex互斥鎖競爭失敗的線程不再自旋直接進入阻塞隊列Park內核態阻塞。優點不消耗CPU空轉缺點線程阻塞、喚醒需要操作系統上下文切換性能開銷大完整升級流程一句話梳理初始無競爭進入偏向鎖出現第二條線程競爭撤銷偏向鎖升級輕量級鎖輕量級鎖自旋獲取鎖失敗最終膨脹為重量級鎖。五、高頻面試易混淆誤區? 誤區1鎖可以降級HotSpot設計鎖只能升級無法降級。一旦變成重量級鎖不會退回輕量級/偏向鎖。? 誤區2輕量級鎖依靠自旋一定比重量級鎖快大量并發場景下持續自旋消耗CPU此時重量級鎖性能更好。? 誤區3偏向鎖永遠更快頻繁競爭場景下偏向鎖撤銷需要STW反而拖慢性能可以通過JVM參數關閉偏向鎖。? 誤區4synchronized修飾方法不存在鎖升級修飾方法同樣基于對象鎖Mark Word保存鎖狀態完整經歷鎖升級流程。六、面試滿分口述答案直接背誦synchronized是JVM內置的互斥鎖底層依托對象頭Mark Word存儲鎖信息同步代碼塊字節碼依靠monitorenter、monitorexit指令實現。在JDK1.6之后引入鎖優化存在鎖升級機制無鎖狀態下單線程訪問開啟偏向鎖當出現線程競爭撤銷偏向鎖升級為輕量級鎖通過自旋嘗試獲取鎖如果自旋失敗進一步膨脹為重量級鎖依托操作系統Monitor互斥量實現線程阻塞。鎖只能升級不能降級。偏向鎖適合單線程無競爭場景輕量級鎖適合線程交替執行、低競爭場景重量級鎖適合高并發競爭場景。七、開發實踐小結如果預知并發競爭激烈可以考慮關閉偏向鎖減少鎖撤銷開銷減少鎖持有代碼范圍縮小鎖粒度避免頻繁創建短期鎖對象降低鎖競爭概率高并發場景可對比Lock鎖與synchronized性能差異。總結synchronized鎖升級是JVM重要優化目的就是在不同競爭程度下平衡性能無競爭用偏向鎖、交替競爭用輕量級自旋鎖、激烈競爭切換重量級鎖。理解Mark Word、Monitor、自旋、鎖升級流程并發面試這塊內容基本暢通無阻。