Synchronized底層工作原理

Synchronized 是Java中最常用的內置鎖機制,用于確保多線程環境下的同步。其底層原理涉及到JVM(Java虛擬機)和字節碼指令。以下是 synchronized 的底層工作原理的詳細介紹:

1. 基本概念

  • 對象頭(Object Header):每個Java對象在內存中都有一個對象頭,包含了鎖標志位(Lock Word)。
  • Monitor:每個對象都有一個與之關聯的監視器(Monitor),監視器是由C++實現的對象,它主要用于實現對象的同步機制。

2. 鎖的狀態

鎖的狀態在對象頭中的鎖標志位表示,可以有以下幾種狀態:

  • 無鎖(Unlocked):沒有線程持有鎖。
  • 偏向鎖(Biased Lock):當一個線程第一次訪問一個對象時,對象頭中的鎖標志位會變為偏向鎖,表明該線程持有鎖。
  • 輕量級鎖(Lightweight Lock):當第二個線程嘗試獲取鎖時,偏向鎖會升級為輕量級鎖。
  • 重量級鎖(Heavyweight Lock):當輕量級鎖競爭失敗時,會升級為重量級鎖。重量級鎖會阻塞所有嘗試獲取鎖的線程,直到持有鎖的線程釋放鎖。

3. synchronized 的實現

synchronized 關鍵字可以用于方法或代碼塊中。其底層實現如下:

3.1 同步代碼塊
synchronized (this) {// critical section
}

同步代碼塊的實現依賴于字節碼指令 monitorentermonitorexit

  • monitorenter:當線程進入同步代碼塊時執行,嘗試獲取對象的Monitor鎖。
  • monitorexit:當線程退出同步代碼塊時執行,釋放對象的Monitor鎖。

每個Monitor對象都包含一個計數器(Owner Count)和一個指向持有該鎖的線程的指針(Owner)。

3.2 同步方法
public synchronized void method() {// critical section
}

同步方法使用 ACC_SYNCHRONIZED 標志。當方法調用時,JVM會自動獲取對象的Monitor鎖,方法執行完畢后釋放鎖。

4. 鎖的升級與膨脹

  • 偏向鎖:偏向鎖會在無競爭的情況下將鎖偏向第一個獲取它的線程。當同一個線程再次進入同步塊時,不需要進行同步操作。
  • 輕量級鎖:當第二個線程嘗試獲取偏向鎖時,會觸發偏向鎖升級為輕量級鎖。這時會在當前線程棧幀中創建一個鎖記錄(Lock Record),并將對象頭中的鎖標志位指向這個鎖記錄。
  • 重量級鎖:如果鎖競爭激烈,輕量級鎖會升級為重量級鎖,涉及到操作系統的互斥量(mutex)實現。重量級鎖會導致線程阻塞和上下文切換。

5. 底層實現示例

以下是一個簡單的示例,展示了同步代碼塊和同步方法在字節碼層面的實現:

同步代碼塊
public void syncBlock() {synchronized (this) {System.out.println("Inside synchronized block");}
}

編譯后的字節碼:

0: aload_0
1: dup
2: astore_1
3: monitorenter
4: getstatic     #2                  // Field java/lang/System.out:Ljava/io/PrintStream;
7: ldc           #3                  // String Inside synchronized block
9: invokevirtual #4                  // Method java/io/PrintStream.println:(Ljava/lang/String;)V
12: aload_1
13: monitorexit
14: goto          22
17: astore_2
18: aload_1
19: monitorexit
20: aload_2
21: athrow
22: return
同步方法
public synchronized void syncMethod() {System.out.println("Inside synchronized method");
}

編譯后的字節碼:

0: getstatic     #2                  // Field java/lang/System.out:Ljava/io/PrintStream;
3: ldc           #3                  // String Inside synchronized method
5: invokevirtual #4                  // Method java/io/PrintStream.println:(Ljava/lang/String;)V
8: return

總結

Synchronized 通過對象頭中的鎖標志位和Monitor對象實現了多線程的同步機制。通過鎖的升級與膨脹策略,它在無競爭的情況下盡可能減少同步開銷,而在競爭激烈的情況下保證線程安全。理解其底層原理有助于更好地使用 synchronized,從而編寫出高效的并發程序。

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

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

相關文章

【UE5.1 角色練習】15-槍械射擊——子彈發射物

目錄 效果 步驟 一、創建并發射子彈 二、優化子彈 效果 步驟 一、創建并發射子彈 1. 在前面的文章中(【UE5.1 角色練習】06-角色發射火球-part1)我們創建了藍圖“BP_Skill_FireBall” 這里我們復制一份命名為“BP_Ammo_5mm”,用于表示…

科技的成就(六十一)

567、數據虛擬化 用來描述所有數據管理方法的涵蓋性術語,這些方法允許應用程序檢索并管理數據,且不需要數據相關的技術細節,例如它格式化的方式或物理位置所在。數據整合的過程,以此獲得更多的數據信息,這個過程通常會…

SLAM中的塊矩陣與schur補

文章目錄 SLAM中的塊矩陣與schur補Schur補的另一種解釋對角塊矩陣的逆為各個塊的逆的組合 SLAM中的塊矩陣與schur補 Schur補的另一種解釋 Schur從概率角度來解釋是比較常見的一種推導,可以參考博客https://blog.csdn.net/weixin_41469272/article/details/1219944…

若依搭建 帝可得 售貨機 筆記

一、搭建項目 1.后端gitee鏈接: 啟動項目時記得修改mysql和redis的相關信息;創建項目相關數據庫,并導入初始化的SQL腳本 dkd-parent: 帝可得后臺管理系統 (gitee.com) 2.前端gitee鏈接: 啟動項目時記得安裝依賴:np…

Github Action 自動部署更新靜態網頁服務

本文首發于 Anyeの小站,點擊跳轉 獲得更優質的閱讀體驗 前言 貼一段胡話 在用過 應用:靜態網頁服務 之后,事實證明: 總而言之,自動化是一個很令人著迷的東西,擺脫重復繁瑣的工作,解放了雙手的…

JCR一區 | Matlab實現GAF-PCNN-MATT、GASF-CNN、GADF-CNN的多特征輸入數據分類預測/故障診斷

JJCR一區 | Matlab實現GAF-PCNN-MATT、GASF-CNN、GADF-CNN的多特征輸入數據分類預測/故障診斷 目錄 JJCR一區 | Matlab實現GAF-PCNN-MATT、GASF-CNN、GADF-CNN的多特征輸入數據分類預測/故障診斷分類效果格拉姆矩陣圖GAF-PCNN-MATTGASF-CNNGADF-CNN 基本介紹程序設計參考資料 分…

【45 Pandas+Pyecharts | 去哪兒海南旅游攻略數據分析可視化】

文章目錄 🏳??🌈 1. 導入模塊🏳??🌈 2. Pandas數據處理2.1 讀取數據2.2 查看數據信息2.3 日期處理,提取年份、月份2.4 經費處理2.5 天數處理 🏳??🌈 3. Pyecharts數據可視化3.1 出發日期_…

華南師范大學“大學生校外實踐教學基地”授牌儀式暨見習參觀活動圓滿結束

為促進校企合作的深入發展,培育出具有實際應用技能的人才,7月9日,華南師范大學數學科學院與廣東泰迪智能科技股份有限公司聯合開展“大學生校外實踐教學基地”授牌儀式暨見習參觀活動。華南師范大學數學科學院數據科學系主任陳艷男、副主任陳…

深入理解model.eval()與torch.no_grad()

model.eval() 使用model.eval()切換到測試模式,不會更新模型的w(權重),b(偏置)參數通知dropout層和batchnorm層在train和val中間進行切換: 在train模式,dropout層會按照設定的參數p…

Idea 2023 使用GitLab提交代碼提示輸入Token

項目場景: 今天電腦換硬盤了,安裝了 IDEA2023 款的社區版開發工具,下載代碼后,提交并推送代碼到遠程服務器的時候,提示輸入Token,并不是用戶名和密碼。 問題描述 推送代碼到遠程GitLab本地倉庫的時候&…

單鏈表--續(C語言詳細版)

2.6 在指定位置之前插入數據 // 在指定位置之前插入數據 void SLTInsert(SLTNode** pphead, SLTNode* pos, SLTDataType x); 分為兩種情況:1. 插入的數據在鏈表中間;2. 插入的數據在鏈表的前面。 // 在指定位置之前插入數據 void SLTInsert(SLTNode** …

AI繪畫何以突飛猛進? 從歷史到技術突破, 一文讀懂火爆的AI繪畫發展史

前言 自從前段時間偶然間被當下AI繪畫的水平震住之后(超越一切的AI作畫神器,和它創作的234個盔甲美女未來戰士) ,作者深感當今AI繪畫的飛速進展或許已遠超所有人的預期。 而這里的前因后果,包括AI繪畫的歷史&#xff…

十九.升職加薪系列-JVM優化-解決JVM性能瓶頸的JIT即時編譯器

前言 在很多年以前,做C或者C的程序員經常說Java語言的運行速度不如C或C,Java運行速度慢主要是因為它是解釋執行的,而C或C是編譯執行的,解釋執行需要通過JVM虛擬機將字節碼實時翻譯成機器碼(邊翻譯邊執行)&…

Rust 版本升級:rustup update stable 報錯

Rust 版本升級 rustup update stable 報錯 一、報錯內容 error: could not download file from ‘https://static.rust-lang.org/dist/channel-rust-stable.toml.sha256’ to ‘/Users/xxx/.rustup/tmp/rv6vdfu3eupwo64m_file’: failed to make network request: error sendi…

【實戰場景】@Transactional中使用for update的注意點

【實戰場景】Transactional中使用for update的注意點 開篇詞:干貨篇:知識回顧注意點1.鎖的范圍和粒度:2.事務的隔離級別:3.死鎖:4.性能影響:5.事務的邊界:6.異常處理:7. 數據庫和存儲…

【漏洞復現】網神 SecGate 3600 防火墻 sys_export_conf_local_save 任意文件讀取

免責聲明: 本文內容旨在提供有關特定漏洞或安全漏洞的信息,以幫助用戶更好地了解可能存在的風險。公布此類信息的目的在于促進網絡安全意識和技術進步,并非出于任何惡意目的。閱讀者應該明白,在利用本文提到的漏洞信息或進行相關測…

javaweb學習day5--《HTML篇》Springboot的模塊創建、HTML的相關知識點詳解

一、前言 從今天開始,就要啟動后端的學習了,Springboot會貫穿到底,一定要跟著小編嚴謹的去搭建Springboot環境,依賴添加的過程可能需要2分鐘左右,讀者們要耐心等待一下,搭建好Springboot之后才算正式的開始…

算力革命:彈性租賃,解鎖無限可能

華為創始人任正非曾在一場程序設計競賽中說道,我們即將進入第四次工業革命,基礎就是大算力。事實上,隨著5G、人工智能等信息技術的迅猛發展,算力需求持續增長,但高昂的成本和快速的技術迭代讓許多中小企業和個人開發者…

Covalent Network(CXT)通過社區投票將代幣遷移并更名為 CXT,以推動人工智能更深層次的創新

專注于人工智能和 Web3 的模塊化數據基礎設施 Covalent Network(CXT)宣布,其治理提案已通過社區投票并順利實施,即將原生代幣 CQT 遷移為新的 CXT 代幣,并部署至新的合約。這一關鍵性轉變標志著 Covalent Network&…

git刪除提交記錄,并使用idea將代碼重新提交到gitee倉庫

git 新建分支將之前的記錄刪除重新提交 轉載鏈接 https://blog.csdn.net/qq_37142541/article/details/139860956