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

相關(guān)新聞

AI論文降重技術(shù)解析與實操指南

AI論文降重技術(shù)解析與實操指南

1. 論文降重困境與AI解決方案概述論文查重率過高是學(xué)術(shù)寫作中普遍存在的痛點(diǎn)。當(dāng)檢測到30%以上的重復(fù)率時,傳統(tǒng)人工降重往往面臨兩大難題:一是機(jī)械性改寫容易破壞原文邏輯鏈條,二是深度重構(gòu)需要消耗大量時間精力。aibiye的AI解決方案正是針對…

2026/7/29 4:06:02 閱讀更多
從ECDSA隨機(jī)數(shù)重用漏洞到私鑰破解:CTF實戰(zhàn)與數(shù)學(xué)推導(dǎo)

從ECDSA隨機(jī)數(shù)重用漏洞到私鑰破解:CTF實戰(zhàn)與數(shù)學(xué)推導(dǎo)

1. 項目概述:當(dāng)ECDSA簽名不再“安全”在CTF的密碼學(xué)賽道上,ECDSA(橢圓曲線數(shù)字簽名算法)相關(guān)的題目一直是區(qū)分選手水平的一道分水嶺。它不像基礎(chǔ)的RSA那樣有大量現(xiàn)成的攻擊腳本,也不像AES對稱加密那樣直觀。ECDSA以其數(shù)…

2026/7/29 3:56:02 閱讀更多
在行空板上部署MediaPipe實現(xiàn)實時人像分割與摳圖

在行空板上部署MediaPipe實現(xiàn)實時人像分割與摳圖

1. 項目緣起:為什么要在行空板上折騰MediaPipe摳圖? 最近在做一個智能交互展項,需要在資源受限的嵌入式設(shè)備上實時處理攝像頭畫面,把人物從背景里干凈地“摳”出來。一開始想到的是上云或者用高性能工控機(jī)跑OpenCVDeeplabv3&#…

2026/7/29 15:07:17 閱讀更多
數(shù)字生命技能工具:動態(tài)流程引擎與協(xié)作效率提升

數(shù)字生命技能工具:動態(tài)流程引擎與協(xié)作效率提升

1. 數(shù)字生命技能工具的核心價值解析在2023年Q3的團(tuán)隊效率調(diào)研報告中,一個令人震驚的數(shù)據(jù)浮現(xiàn):知識工作者平均每天要花費(fèi)2.1小時在重復(fù)性的流程溝通上。這正是我們團(tuán)隊開發(fā)數(shù)字生命技能工具的初衷——將那些"只存在于老員工腦子里"的協(xié)作經(jīng)驗轉(zhuǎn)…

2026/7/29 15:07:17 閱讀更多
COMSOL納米孔陣列超表面透射譜仿真技巧與優(yōu)化

COMSOL納米孔陣列超表面透射譜仿真技巧與優(yōu)化

1. 項目概述:納米孔陣列超表面透射譜仿真 第一次在COMSOL中嘗試仿真納米孔陣列超表面時,我遇到了一個有趣的現(xiàn)象:理論上應(yīng)該出現(xiàn)明顯透射峰的位置,仿真結(jié)果卻顯示為平坦的直線。這個問題困擾了我整整三天,直到發(fā)現(xiàn)是網(wǎng)…

2026/7/29 15:07:17 閱讀更多
從C語言文件管理系統(tǒng)到Linux裝NAS:開發(fā)者的自建存儲之路

從C語言文件管理系統(tǒng)到Linux裝NAS:開發(fā)者的自建存儲之路

開發(fā)者論壇里的一次討論 “用易語言寫個內(nèi)網(wǎng)穿透軟件難不難?”這是某開發(fā)者社區(qū)里一個常見問題。回答區(qū)里的思路大致分兩派:一派認(rèn)為易語言上手快,做個簡單的端口映射工具并不復(fù)雜;另一派則提醒,穩(wěn)定的內(nèi)網(wǎng)穿透涉及NAT…

2026/7/29 14:57:16 閱讀更多
面試官大笑:“一個任務(wù)拆給 5 個 Subagent 并行跑,不比 1 個快 5 倍?“我搖頭:“快不了,還可能更慢“

面試官大笑:“一個任務(wù)拆給 5 個 Subagent 并行跑,不比 1 個快 5 倍?“我搖頭:“快不了,還可能更慢“

前兩個月,我在重構(gòu) AlgoMooc 網(wǎng)站過程中,發(fā)現(xiàn)一個問題:在 Claude Code 里把一個任務(wù)拆給 5 個 Subagent 并行跑,結(jié)果可能比 1 個 agent 從頭干到尾還慢? 大多數(shù)人的第一反應(yīng)是反過來的:活是并行干的&#…

2026/7/29 0:15:24 閱讀更多
# 鴻蒙 HarmonyOS 應(yīng)用開發(fā)實戰(zhàn)(第25期)|骰子(Dice Roller)— Unicode 符號與動畫渲染精講

# 鴻蒙 HarmonyOS 應(yīng)用開發(fā)實戰(zhàn)(第25期)|骰子(Dice Roller)— Unicode 符號與動畫渲染精講

一、應(yīng)用概述 骰子(Dice Roller) 是一款經(jīng)典的休閑娛樂應(yīng)用,模擬了真實擲骰子的過程。應(yīng)用投擲兩個骰子(六面標(biāo)準(zhǔn)骰),使用 Unicode 骰面符號直觀展示每個骰子的點(diǎn)數(shù),并伴有快速滾動的動畫效果。…

2026/7/29 0:15:24 閱讀更多