synchronized鎖升級的過程(從無鎖到偏向鎖,再到輕量級鎖,最后到重量級鎖的一個過程)

鎖升級是 Java 中?synchronized 鎖?的核心優化機制(基于 JVM 的?對象頭 Mark Word?實現),指鎖的狀態從?無鎖 → 偏向鎖 → 輕量級鎖 → 重量級鎖?逐步升級的過程。其目的是通過 “按需升級”,在不同并發場景下選擇最優的鎖實現,平衡性能與線程安全。

一、鎖的四種狀態

在講解升級過程前,需先明確 synchronized 鎖的四種狀態(按開銷從小到大排序):

鎖狀態核心特點適用場景
無鎖無鎖競爭,對象未被任何線程鎖定單線程訪問
偏向鎖僅記錄第一個獲取鎖的線程 ID,后續該線程可直接重入,無需競爭單線程重復獲取鎖(無并發)
輕量級鎖多線程交替獲取鎖,通過?CAS 操作?競爭鎖,避免內核態切換低并發(線程交替執行)
重量級鎖多線程同時競爭鎖,依賴操作系統?互斥量(Mutex),會阻塞線程高并發(線程頻繁競爭)

二、鎖升級的完整過程

鎖升級的觸發條件是 “并發競爭加劇”,JVM 會根據線程競爭情況,自動將鎖從低開銷狀態升級到高開銷狀態,且升級過程是?單向的(不可逆)(如偏向鎖升級為輕量級鎖后,不會再降級為偏向鎖)。

1. 第一步:無鎖 → 偏向鎖

  • 觸發場景:單線程首次獲取 synchronized 鎖時,JVM 為了減少鎖開銷,會將鎖初始化為 “偏向鎖”。
  • 核心操作
    1. 線程 A 嘗試獲取鎖時,檢查對象頭的?Mark Word(存儲對象鎖狀態的字段),發現當前是 “無鎖” 狀態。
    2. 通過?CAS 操作,將?Mark Word?中的 “鎖狀態” 改為 “偏向鎖”,并記錄線程 A 的 ID(threadId)和 “偏向時間戳”。
    3. 后續線程 A 再次進入 synchronized 代碼塊時,只需對比?Mark Word?中的線程 ID 是否為自己:
      • 是:直接重入鎖,無需任何 CAS 或阻塞操作(開銷極低)。
      • 否:觸發偏向鎖撤銷,進入下一步升級。

2. 第二步:偏向鎖 → 輕量級鎖

  • 觸發場景:當有?第二個線程(線程 B)嘗試獲取同一把鎖?時,偏向鎖的 “單線程假設” 被打破,JVM 會撤銷偏向鎖,升級為 “輕量級鎖”。
  • 核心操作
    1. 線程 B 嘗試獲取鎖時,發現?Mark Word?記錄的是線程 A 的 ID(偏向鎖狀態),且線程 A 可能仍在執行(或已退出但未清理偏向鎖)。
    2. JVM 首先會?暫停線程 A,檢查線程 A 的狀態:
      • 若線程 A 已退出:將?Mark Word?重置為 “無鎖”,線程 B 重新嘗試 CAS 獲取輕量級鎖。
      • 若線程 A 仍在執行:撤銷偏向鎖(將?Mark Word?中的偏向狀態清除),進入輕量級鎖競爭。
    3. 輕量級鎖的競爭邏輯:
      • 線程 A 和線程 B 會分別在自己的?棧幀?中創建一個 “鎖記錄(Lock Record)”,存儲對象頭?Mark Word?的副本(稱為?Displaced Mark Word)。
      • 線程通過?CAS 操作,嘗試將對象頭的?Mark Word?指向自己的 “鎖記錄地址”:
        • 成功:獲取輕量級鎖,執行同步代碼。
        • 失敗:判斷當前鎖是否仍為輕量級鎖(未升級),若仍是,則自旋重試 CAS(避免阻塞);若自旋次數超過閾值(默認 10 次,或自適應自旋),則進入下一步升級。

3. 第三步:輕量級鎖 → 重量級鎖

  • 觸發場景:當?多個線程同時競爭鎖(如線程 A、B、C 同時嘗試獲取鎖),或輕量級鎖的?CAS 自旋重試失敗?時,輕量級鎖的 “交替執行假設” 被打破,JVM 會將鎖升級為 “重量級鎖”。
  • 核心操作
    1. 線程 C 嘗試 CAS 獲取輕量級鎖時,發現對象頭的?Mark Word?已指向線程 A 的鎖記錄(線程 A 持有輕量級鎖),且自旋重試多次后仍未成功。
    2. JVM 會將輕量級鎖的 “鎖狀態” 改為 “重量級鎖”,并將對象頭的?Mark Word?指向?操作系統的互斥量(Mutex)?地址。
    3. 此時未獲取到鎖的線程(如 B、C)會?放棄 CAS 自旋,轉而調用操作系統的?park()?方法,進入?阻塞狀態(內核態切換,開銷高)。
    4. 當持有鎖的線程 A 釋放鎖時,會通過操作系統的?unpark()?方法,喚醒阻塞隊列中的一個線程(如 B),線程 B 重新競爭重量級鎖。

三、關鍵細節:對象頭 Mark Word 的角色

鎖升級的本質是?對象頭 Mark Word 的狀態變化,不同鎖狀態下,Mark Word?的存儲內容不同(以 64 位 JVM 為例):

鎖狀態Mark Word 存儲內容(簡化)鎖狀態標識位
無鎖對象哈希碼(hashCode) + 無鎖標識01
偏向鎖偏向線程 ID + 偏向時間戳 + 偏向鎖標識01(特殊標記)
輕量級鎖指向線程棧幀中 “鎖記錄” 的指針 + 輕量級鎖標識00
重量級鎖指向操作系統 “互斥量” 的指針 + 重量級鎖標識10

JVM 通過讀取?Mark Word?的 “鎖狀態標識位”,即可判斷當前鎖的狀態,進而執行對應的升級邏輯。

四、鎖升級的核心目的

鎖升級的設計思想是 “因地制宜”:

單線程場景:用偏向鎖最小化鎖開銷(幾乎無成本)。

低并發場景:用輕量級鎖的 CAS 操作避免線程阻塞(用戶態操作,開銷低)。

高并發場景:用重量級鎖的互斥量保證線程安全(雖開銷高,但能穩定處理競爭)。

通過這種 “按需升級” 的機制,synchronized 鎖在不同并發場景下都能兼顧性能與安全性,避免了 “一刀切” 的鎖開銷問題(如早期 synchronized 直接使用重量級鎖,單線程場景下也有高開銷)。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/99128.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/99128.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/99128.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

HOT100--Day25--84. 柱狀圖中最大的矩形,215. 數組中的第K個最大元素,347. 前 K 個高頻元素

HOT100–Day25–84. 柱狀圖中最大的矩形,215. 數組中的第K個最大元素,347. 前 K 個高頻元素 每日刷題系列。今天的題目是《力扣HOT100》題單。 題目類型:棧,堆。 84. 柱狀圖中最大的矩形 思路: class Solution {publ…

基于 Apache Doris 的用戶畫像數據模型設計方案

一、 需求分析與設計目標數據源:用戶基本信息:用戶ID、性別、出生日期、注冊時間、常駐地域(省、市、區)、職業等。用戶體檢報告:每次體檢的報告ID、體檢時間、各項指標(如血壓、血糖、血脂、BMI等&#xf…

Python的深度學習

深入理解Python高級特性掌握Python的高級特性是進階的關鍵,包括裝飾器、生成器、上下文管理器、元類等。這些特性能夠提升代碼的靈活性和效率。例如,裝飾器可以用于實現AOP(面向切面編程),生成器可以處理大數據流而無需…

數據庫范式(Normalization)

一個設計混亂的數據庫就像一個雜亂的房間,用起來非常不方便:東西到處亂放(數據冗余),找件東西要翻遍所有角落(查詢困難),扔掉一把舊椅子時,可能會把搭在上面的唯一一件外…

數據結構---循環隊列

基于循環數組實現的循環隊列解決了順序隊列中的假溢出導致的空間浪費問題操作:(1)初始化//循環隊列 typedef struct {int *data;//指針模擬聲明數組int head,tail;//隊頭,隊尾 }Queue; //初始化 Queue *InitQueue() {Queue *q (Q…

深入理解線程模型

線程作為操作系統調度的基本執行單元,是實現高吞吐、低延遲系統的基礎。一、進程與線程的體系結構對比核心概念:進程(Process):操作系統資源分配的基本單位,擁有獨立的虛擬地址空間、文件描述符表、環境變量…

TTC定時器中斷——MPSOC實戰3

開啟TTC定時器&#xff0c;不同于7000系列的私有定時器此處設置LPD_LSBUS頻率TTC頻率取決于LPD_LSBUS可前往指定位置查看參數不使能填寫對應宏可前往指定位置查看參數main.c#include <stdio.h> #include "xparameters.h" #include "xgpiops.h" #incl…

人工智能訓練師三級備考筆記

一、實操1&#xff09;通用語法&#xff08;常見于實操題第一塊代碼塊&#xff09;1.讀取文件數據或加載數據集等描述時一般為以下結構&#xff1a;Datapd.read_文件格式(文件名) 注意&#xff1a;文件名需要用‘ ’框起來&#xff0c;必須要有引號文件格式有以下內容csv、txt…

Cherry Studio遞歸工具調用機制深度解析

在現代AI應用開發中,工具調用(Tool Calling)已成為大語言模型與外部系統交互的核心機制。Cherry Studio作為一款先進的AI對話客戶端,實現了一套完整的遞歸工具調用系統,能夠讓AI助手在執行復雜任務時自動調用多個工具,并根據執行結果智能決策下一步操作。本文將深入解析這…

[哈希表]966. 元音拼寫檢查器

966. 元音拼寫檢查器 class Solution:def spellchecker(self, wordlist: List[str], queries: List[str]) -> List[str]:origin set(wordlist) # 存儲原始單詞用于完全匹配lower_to_origin {} # 存儲小寫形式到原始單詞的映射vowel_to_origin {} # 存儲元音模糊形…

正則表達式與文本三劍客(grep、sed、awk)基礎與實踐

正則表達式基礎與實踐一、正則表達式概述1. 定義正則表達式&#xff08;Regular Expression&#xff0c;簡稱 RE&#xff09;是用于描述字符排列和匹配模式的語法規則&#xff0c;核心作用是對字符串進行分割、匹配、查找、替換操作。它本質是 “模式模板”&#xff0c;Linux 工…

eclipse中web項目編譯后的lib里面jar為空問題處理

1. 檢查項目構建配置驗證項目性質右鍵單擊項目 → Properties確認項目已正確配置&#xff1a;?Project Facets?&#xff1a;確保已勾選"Dynamic Web Module"?Targeted Runtimes?&#xff1a;確保已選擇服務器運行時&#xff08;如Tomcat&#xff09;檢查部署程序…

C語言中的遞歸問題——漢諾塔問題

漢諾塔&#xff08;Tower of Hanoi)&#xff0c;又稱河內塔&#xff0c;是一個源于印度古老傳說的益智玩具。傳說大梵天創造世界的時候做了三根金剛石柱子&#xff0c;在一根柱子上從下往上按照大小順序摞著64片黃金圓盤。大梵天命令婆羅門把圓盤從下面開始按大小順序重新擺放在…

ArkAnalyzer源碼初步分析I——分析ts項目流程

1.前言&#xff1a; 鴻蒙程序分析框架ArkAnalyzer&#xff08;方舟分析器&#xff09; 源碼地址 入門文檔 2.閱讀入門文檔后&#xff1a; 本人具有一定的Java開發經驗。雖然我對 TypeScript&#xff08;TS&#xff09;和 ArkTS 還不熟&#xff0c;但很多概念對我這個 Java 開…

c#基礎二(類和對象,構造器調用順序、訪問級別、重寫和多態、抽象類和接口)

一、類1.0對象初始化器class Student {public String name;public int age { get; set; } } internal class Program {static void Main(string[] args){ //寫法一Student stunew Student();stu.name"Tom";stu.age20;//寫法二Student stu2 new Student { name &qu…

Qt之快捷鍵、事件處理、自定義按鍵——完成記事本項目

快捷鍵我們電腦中的記事本中還支持快捷鍵&#xff0c;如“CTRLO”打開文件、“CTRLS”保存文件在Qt中使用QShortcut這個類創建快捷鍵在.cpp文件的構造函數中創建QShortcut對象&#xff0c;綁定打開文件和保存文件的槽函數放大縮小字體還是在.cpp的構造函數中編寫代碼Widget::Wi…

Open cascade中如何使用BRepAlgoAPI_Splitter分割一個Face

理論介紹 在OpenCASCADE幾何建模內核中&#xff0c;BRepAlgoAPI_Splitter是一個強大的工具&#xff0c;用于將一個形狀&#xff08;Shape&#xff09;用另一個形狀&#xff08;Tool&#xff09;進行分割。這種操作在CAD建模中非常常見&#xff0c;比如用平面切割實體、用曲線分…

【醫療 AI】Baichuan-M2 醫療大模型:技術解讀與使用方法

【醫療 AI】Baichuan-M2 醫療大模型&#xff1a;技術解讀與使用方法1. Baichuan-M2 醫療大模型簡介1.1 基本信息1.2 下載地址1.3 技術特點2. Baichuan-M2 模型技術報告2.1 摘要2.2 醫學性能評估2.2.1 HealthBench基準2.2.2 中國醫療場景對比評估2.3 系統架構2.3.1 驗證器系統2.…

unity pcd 二進制版 簡單顯示文件對象(單色)

unity Point Cloud Viewer and Tool 那個插件不支持pcd二進制&#xff0c;而且網上到處都是AI 我恨這種AI濫用&#xff0c;提供不了一點價值 好了&#xff0c;言歸正傳 可以在Point Cloud Viewer and Tool這個插件報錯地方轉用這個代碼&#xff0c;具體咋結合請自行研究。 …

強大的開源文檔問答工具-Kotaemon

Kotaemon 是一個基于 RAG&#xff08;Retrieval-Augmented Generation&#xff09;架構的開源文檔問答工具&#xff0c;為用戶提供與文檔對話的智能交互體驗。該項目同時服務于終端用戶和開發者&#xff0c;具有高度的可擴展性和定制化能力。技術棧分析核心技術棧后端框架Pytho…