JUC:10.線程、monitor管程、鎖對象之間在synchronized加鎖的流程(未完)

一、monitor管程工作原理:

首先,synchronized是一個對象鎖,當線程運行到某個臨界區,這個臨界區使用synchronized對對象obj進行了上鎖,此時底層發生了什么?

1.當synchronized對obj上鎖后,synchronized會與操作系統層面的monitor管程建立連接,也就是在obj的header中構建一個指向monitor的指針。

2.此時線程訪問臨界區代碼,發現Obj鎖,所以去查看obj的header中的mark word中指向管程monitor的指針,從而找到monitor。線程會去查看monitor中的owner部分,訪問owner,如果owner目前沒有線程訪問,該線程成為owner去執行臨界區代碼段。如果存在owner,線程就被放進monitor中的entryset中,相當于等待隊列,等待執行完臨界區代碼段的線程的喚醒。

二、其中線程與obj的交互如下:

線程訪問臨界區后,會在棧幀中創建obj的指針以及lock record。

lockrecord中記錄著 當前鎖記錄的地址。

然后會與obj進行交互,嘗試使用cas將 lock record中的地址+鎖狀態 與 obj中的mark word交換。

如果交換成功,mark word 中存儲的lock狀態就會從00轉換為01,表示當前的obj為輕量級鎖。

現在的lock record中存放著obj 的 地址, 而 obj中也有到線程鎖記錄的地址。

完整流程:

首先需要明確,輕量級鎖不需要訪問monitor,因為與操作系統層面的monitor管程建立連接的花銷很高。

在線程之間沒有因為臨界區而交互時,此時掛載的是輕量級鎖。流程如下:

首先線程調用任何方法都會將該方法存放在方法區中,并且在線程的棧幀中保存該方法的局部變量、方法參數以及返回地址。

由于該方法有臨界區(加鎖),此時在線程的棧幀中還會維護鎖對象(synchronized是一個對象鎖,鎖住的對象需要創建對應的索引信息)的地址以及lock record(鎖記錄)用于存儲當前線程的地址。

同時會在棧幀中的額外槽位slot中維護鎖對象的header中的mark word(用于釋放鎖的還原)。

執行CAS 操作:構造一個新的 Mark Word:

  • 低兩位改為 01(輕量級鎖標志)

  • 高位填入指向自己棧幀 Lock Record 的地址
    然后對對象頭做原子 CAS:

  • 成功 → 輕量級鎖加鎖成功,對象頭和 Lock Record 雙向鏈上了;

  • 失敗 → 表示有另一個線程同時在搶這個鎖,進入自旋重試或鎖膨脹(升級到重量級鎖)。

解鎖的過程只需要再將棧幀中維護的舊對象頭替換回對象中即可。

當有其他線程發現鎖對象的鎖狀態不為00,此時就會進行后續處理,比如自旋,自旋失敗后,將后續的鎖升級為重量級鎖。

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

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

相關文章

Elasticsearch(ES)分頁

Elasticsearch(簡稱 ES)本身不適合傳統意義上的“深分頁”,但提供了多種分頁方式,每種適用不同場景。我們來詳細講解: 一、基本分頁(from size) 最常用的分頁方式,類似 SQL 的 LIM…

原生微信小程序:用 `setData` 正確修改數組中的對象項狀態(附實戰技巧)

📌 背景介紹 在微信小程序開發中,我們經常需要修改數組中某個對象的某個字段,比如: 列表中的某一項展開/收起多選狀態切換數據列表中的臨時標記等 一個常見的場景是: lists: [{ show: true }, { show: true }, { s…

Oracle 臨時表空間相關操作

一、臨時表空間概述 臨時表空間(Temporary Tablespace)是Oracle數據庫中用于存儲臨時數據的特殊存儲區域,其數據在會話結束或事務提交后自動清除,重啟數據庫后徹底消失。主要用途包括: 存儲排序操作(如OR…

從靜態到動態:Web渲染模式的演進和突破

渲染模式有好多種,了解下web的各種渲染模式,對技術選型有很大的參考作用。 一、靜態HTML時代 早期(1990 - 1995年)網頁開發完全依賴手工編寫HTML(HyperText Markup Language)和CSS(層疊樣式表…

Flask(六) 數據庫操作SQLAlchemy

文章目錄 一、準備工作二、最小化可運行示例? 補充延遲綁定方式(推薦方式) 三、數據庫基本操作(增刪改查)1. 插入數據(增)2. 查詢數據(查)3. 更新數據(改)4.…

PYTHON從入門到實踐7-獲取用戶輸入與while循環

# 【1】獲取用戶輸入 # 【2】python數據類型的轉換 input_res input("請輸入一個數字\n") if int(input_res) % 10 0:print("你輸入的數是10的倍數") else:print("你輸入的數不是10的倍數") # 【3】while循環,適合不知道循環多少次…

學習筆記(C++篇)—— Day 8

1.STL簡介 STL(standard template libaray-標準模板庫):是C標準庫的重要組成部分,不僅是一個可復用的組件庫,而且是一個包羅數據結構與算法的軟件框架。 2.STL的六大組件 先這樣,下一部分是string的內容,內容比較多&a…

ant+Jmeter+jenkins接口自動化,如何實現把執行失敗的接口信息單獨發郵件?

B站講的最好的自動化測試教程,工具框架附項目實戰一套速通,零基礎完全輕松掌握!自動化測試課程、web/app/接口 實現AntJMeterJenkins接口自動化失敗接口郵件通知方案 要實現只發送執行失敗的接口信息郵件通知,可以通過以下步驟實…

惡意Python包“psslib“實施拼寫錯誤攻擊,可強制關閉Windows系統

Socket威脅研究團隊發現一個名為psslib的惡意Python包,該軟件包偽裝成提供密碼安全功能,實則會突然關閉Windows系統。這個由化名umaraq的威脅行為者開發的軟件包,是對知名密碼哈希工具庫passlib的拼寫錯誤仿冒(typosquatting&…

云原生灰度方案對比:服務網格灰度(Istio ) 與 K8s Ingress 灰度(Nginx Ingress )

服務網格灰度與 Kubernetes Ingress 灰度是云原生環境下兩種主流的灰度發布方案,它們在架構定位、實現方式和適用場景上存在顯著差異。以下從多個維度對比分析,并給出選型建議: 一、核心區別對比 維度服務網格灰度(以 Istio 為例…

科技如何影響我們的生活?

科技已成為我們生活中不可或缺的一部分,徹底改變了我們工作、溝通和生活的方式。從智能手機到智能家居,科技已滲透到我們生活的每個角落。無論是用手機鬧鐘開啟新的一天,通過 Alexa 開關燈光,還是打開 Uber 或 Lyft 打車上班&…

Re--攻防世界-基礎android

Jadx 可以看到有賬號密碼輸入 進入checkPassword函數 分析一下: 對每個字符 pass[len] 進行以下計算 pass[len] (char) (((255 - len) - 100) - pass[len]); 解密腳本 def decrypt_password(): password [] for len in range(12): c (255 - le…

InnoDB表空間結構-系統表空間

系統表空間整體結構 頁號為7的SYS類型頁結構

如何構建知識庫

構建個人知識庫是一個系統化的過程,需要結合工具選擇、信息管理和持續優化。以下是分步驟的實用指南,包含現代工具和方法的建議: 一、明確知識庫定位(Why) ?核心目標? 學習型:支持學術研究/職業發展&…

3 大語言模型預訓練數據-3.2 數據處理-3.2.2 冗余去除——2.SimHash算法文本去重實戰案例:新聞文章去重場景

SimHash算法文本去重實戰案例:新聞文章去重場景 一、案例背景與目標二、具體實現步驟與示例1. **待去重文本示例**2. **步驟1:文本預處理與特征提取**3. **步驟2:特征向量化與哈希映射**4. **步驟3:特征向量聚合**5. **步驟4&…

MSPM0G3507之GPIO配置報錯 #Sysconfig報錯

聲明:本文完全免費閱讀,如果你發現某天文章被設置了“VIP權限”,請私信我解除(非筆者所為)。 一、問題現象 在打開sysconfig后,GPIO這里會報錯。 Unable to render selection Error:launchPadShortcut:Vali…

2025年檢測相機十大品牌測評:工業級精度與場景化解決方案解析

一、引言 在工業自動化與智能制造領域,檢測相機作為質量管控的核心硬件,正以“高精度、高速度、高適應性”的特性重塑生產流程。這類設備通過光學成像與智能算法結合,實現對工件表面缺陷、尺寸偏差、裝配精度的精準檢測,效率較傳…

Python異步編程深度解析

一、異步編程范式演進 同步阻塞的困境:GIL限制與線程切換開銷 事件循環本質:單線程并發模型 協程優勢:比線程更輕量的執行單元 IO密集型場景:網絡請求/文件操作的最佳實踐 二、核心語法精要 import asyncioasync def fetch_…

網絡緩沖區

用戶態網絡緩沖區 網絡緩沖區原理為什么需要用戶態網絡緩沖區Linux下如何接收和發送數據包用戶態網絡緩沖區設計的本質 網絡緩沖區代碼實現 網絡緩沖區原理 為什么需要用戶態網絡緩沖區 在網絡開發中,我們經常使用到read/write/recv/send等系統調用接口&#xff0…

微信小程序實現簡版點贊動畫

這是第二次寫canvas,基于微信小程序文檔demo進行改寫 demo效果為方塊橫向來回循環移動 我想做的是直播間那種點贊效果,豎向曲線移動、方塊換成圖片、點擊添加繪制元素 第一階段實現豎向曲線移動、點擊添加繪制元素;下一階段講方塊替換為圖…