
在 Java 并發編程體系中synchronized內置鎖與ReentrantLock顯式鎖是實現線程同步、保證并發安全的兩大核心方案。絕大多數開發者只會表層使用synchronized 簡單、ReentrantLock 靈活但完全說不清核心差異為什么 JDK1.6 優化后 synchronized 性能反超 ReentrantLock顯式鎖靈活在哪里什么場景必須放棄 synchronized 用 ReentrantLock兩者的底層鎖機制、調度邏輯、并發能力有哪些本質區別一、前置核心認知兩大鎖的本質定位1.1 synchronizedJVM 原生內置隱式鎖synchronized 是 Java 語言原生關鍵字由 JVM 底層硬編碼實現屬于隱式鎖。鎖的獲取、釋放全部由 JVM 自動管控開發者無需手動干預簡單無腦、自動兜底。核心定位極簡通用型同步鎖主打低學習成本、自動安全、無需手動運維適配絕大多數普通并發場景。1.2 ReentrantLockJDK 代碼實現顯式鎖ReentrantLock 是java.util.concurrent.locks包下的工具類鎖基于 AQS抽象隊列同步器純代碼實現屬于顯式鎖。鎖的獲取、釋放、調度策略全部由開發者手動編碼控制高度靈活。核心定位高階增強型同步鎖主打高靈活性、可定制、強并發能力適配復雜、高并發、精細化管控的業務場景。二、底層實現原理深度拆解最核心差異2.1 synchronized 底層原理JVM 層級鎖升級機制JDK1.6 之前synchronized 是笨重的重量級鎖依賴操作系統 Mutex 互斥量需要用戶態與內核態切換開銷極大。JDK1.6 對其進行極致自適應優化引入三級鎖升級機制全程自動適配場景無需開發者干預無競爭場景偏向鎖零開銷、無CAS、無同步操作單線程重復加鎖直接放行輕微競爭場景輕量級鎖用戶態CAS自旋無線程阻塞、無內核切換用少量CPU空轉避免阻塞開銷激烈競爭場景重量級鎖依托操作系統內核互斥量線程阻塞入隊犧牲內核開銷保證并發穩定核心底層特點鎖狀態存儲在對象頭 Mark Word中鎖升級單向不可逆全程 JVM 自動調度無人工干預空間。2.2 ReentrantLock 底層原理AQS 獨占可重入機制ReentrantLock 從 JDK1.5 誕生之初底層就固定基于AQSAbstractQueuedSynchronizer實現無鎖升級機制從始至終都是統一的獨占鎖模型。核心底層邏輯依托 AQS 的state 狀態變量記錄鎖持有次數實現可重入特性依托 AQS雙向阻塞隊列完成搶鎖失敗線程的排隊、喚醒、調度原生支持公平鎖/非公平鎖手動切換默認非公平鎖所有鎖競爭、排隊、喚醒邏輯均為Java 代碼層級實現不依賴操作系統內核核心底層特點無自適應鎖升級純用戶態代碼調度靈活性拉滿、可定制性極強但簡單場景下冗余邏輯更多。三、核心功能與特性全方位對比3.1 鎖的可重入性共同點兩者均支持可重入同一個線程獲取鎖后可重復加鎖不會出現自己阻塞自己的死鎖問題。synchronizedJVM 底層自動記錄重入次數無需手動計數自動解鎖ReentrantLock基于 AQS state 變量計數加鎖 state1解鎖 state-1必須成對解鎖3.2 鎖釋放機制核心差異synchronized隱式釋放代碼執行完畢、異常拋出時JVM自動釋放鎖絕對不會出現鎖泄露安全性極高ReentrantLock顯式釋放必須手動在finally 代碼塊中調用 unlock()釋放鎖代碼異常、忘記釋放會直接導致永久鎖泄露、線程死鎖3.3 公平鎖支持synchronized僅支持非公平鎖無任何手動配置方式鎖釋放后隨機喚醒等待線程無法保證先來先到ReentrantLock原生雙模式支持構造方法傳入 true 開啟公平鎖FIFO排隊默認非公平鎖可自由切換3.4 鎖等待可控性synchronized搶鎖失敗線程永久阻塞無法超時、無法中斷極易出現線程卡死、服務雪崩問題ReentrantLock提供tryLock()超時搶鎖、lockInterruptibly()可中斷搶鎖完全可控從根源規避死鎖和永久阻塞3.5 精準喚醒機制synchronized依托 Object 的 wait/notify只能隨機喚醒一個線程或全部喚醒無法精準喚醒存在無效喚醒、資源浪費問題ReentrantLock依托Condition 條件隊列可創建多個條件隊列實現精準分組喚醒按需喚醒指定線程并發效率更高3.6 鎖狀態可監控synchronized無任何 API 可監控鎖狀態無法判斷是否加鎖、是否被占用、等待線程數量排查問題困難ReentrantLock提供豐富監控 APIisLocked()、getQueueLength()、hasWaiters()可實時監控鎖狀態、線程排隊情況便于線上問題排查四、性能差異深度解析架構師必懂4.1 JDK1.6 前后性能反轉JDK1.5 及之前synchronized 只有重量級鎖內核切換開銷巨大性能遠差于 ReentrantLockJDK1.6 及之后synchronized 引入自適應鎖升級無競爭/輕微競爭場景開銷極低整體性能反超 ReentrantLock4.2 不同場景性能表現低競爭、單線程場景synchronized 偏向鎖零開銷性能優于 ReentrantLockReentrantLock 存在 AQS 代碼邏輯冗余開銷中等交替競爭場景兩者性能持平synchronized 輕量級鎖 CAS 自旋與 AQS 調度開銷相近高并發激烈競爭場景ReentrantLock 性能更優可通過公平鎖、超時機制、精準喚醒減少無效競爭而 synchronized 極易直接升級為重量級鎖性能暴跌五、全方位核心差異對比表對比維度Synchronized內置鎖ReentrantLock顯式鎖實現層級JVM 底層原生實現關鍵字JDK 代碼層級實現AQS 工具類鎖模式僅非公平鎖不可配置公平/非公平鎖可手動切換鎖釋放方式自動釋放代碼結束/異常安全無泄露手動 unlock() 釋放需 finally 兜底易泄露等待可控性不可超時、不可中斷永久阻塞支持超時搶鎖、可中斷搶鎖完全可控喚醒機制notify()/notifyAll()隨機/全部喚醒無精準控制Condition 精準分組喚醒按需喚醒鎖監控能力無監控 API無法排查鎖狀態豐富監控 API可查看排隊、等待線程數底層機制偏向鎖→輕量級鎖→重量級鎖 自適應升級AQS 雙向隊列 state 計數無鎖升級代碼簡潔度極簡一行關鍵字搞定繁瑣需手動加鎖、解鎖、異常兜底可重入性支持JVM 自動計數兜底支持AQS state 手動計數適用場景低并發、普通同步、簡單場景高并發、復雜同步、需要精細化管控場景六、精準選型口訣落地核心6.1 優先選擇 Synchronized 的場景選型口訣簡單同步、低并發、無需特殊管控一律用 synchronized普通方法、代碼塊同步邏輯簡單并發競爭不激烈單線程/少量線程交替執行追求代碼簡潔、低維護成本、杜絕鎖泄露不需要超時鎖、公平鎖、精準喚醒等特殊能力架構師思考JDK1.6 后 synchronized 性能足夠優秀且自動兜底、零運維簡單場景用它性價比最高。6.2 必須選擇 ReentrantLock 的場景選型口訣需靈活管控、高并發、防死鎖、精準同步必用 ReentrantLock需要公平鎖必須保證線程先來先到杜絕線程饑餓需要超時搶鎖防止永久阻塞、規避死鎖服務容錯優先精準線程喚醒生產者消費者、多條件分組等待場景高并發激烈競爭需要穩定可控的鎖調度避免鎖升級重量級鎖雪崩線上鎖問題排查需要監控鎖狀態、線程排隊數量七、生產環境高頻避坑指南7.1 Synchronized 避坑點禁止同步代碼塊過長執行耗時過久會導致鎖競爭激烈快速升級為重量級鎖吞吐量暴跌避免鎖對象變更鎖對象為變量時對象替換會導致鎖失效引發并發安全問題杜絕永久阻塞場景無超時、不可中斷特性高并發下易造成線程堆積、服務卡死明確鎖范圍盡量縮小同步粒度只鎖核心共享代碼避免大范圍鎖競爭7.2 ReentrantLock 避坑點必須 finally 解鎖絕對禁止忘記 unlock()、異常跳過解鎖直接導致鎖泄露、死鎖tryLock 必須判空不判斷搶鎖成功狀態直接執行業務引發線程安全問題重入鎖成對解鎖多次加鎖必須對應多次解鎖否則鎖無法釋放不濫用公平鎖公平鎖犧牲性能換順序無業務需求默認用非公平鎖八、全文核心總結1.本質區別synchronized 是 JVM 自動管控的隱式鎖主打簡單安全、自適應優化ReentrantLock 是代碼手動管控的顯式鎖主打靈活可控、功能強大。2.性能取舍低競爭場景 synchronized 更優高并發復雜場景 ReentrantLock 更穩定JDK1.6 無絕對性能碾壓只有場景適配。3.功能取舍synchronized 能力基礎夠用無高級特性ReentrantLock 擁有超時鎖、公平鎖、精準喚醒、狀態監控等高階能力適配復雜業務。4.終極選型原則簡單場景無腦用 synchronized復雜高并發、需要精細化鎖管控場景必用 ReentrantLock絕不反向選型。