線程安全-1 synchronized鎖升級

一.說一下synchronized關鍵字的底層原理

1.synchronized又叫同步鎖,采用互斥的方式使同一時刻只能有一個線程持有鎖。

2.jdk1.6及以前,synchronized底層是用monitor實現的。monitor是jvm級別的對象,由c++實現。每一個對象對應一個monitor,線程要獲取鎖需要通過一個對象去關聯其monitor,由這個對象來充當鎖介質,因此又叫對象鎖。

3.monitor由三部分組成

(1)owner:關聯當前持有鎖的線程。同一時刻只能有一個線程持有鎖。

(2)EntryList:關聯所有沒有競爭到鎖的線程。當一個線程釋放鎖,會喚醒EntryList中所有線程一起爭搶鎖,與阻塞的先后順序無關,因此是一種非公平鎖。

(3)WaitSet:關聯所有持有鎖后調用wait()進入等待狀態的線程,這些線程進入等待狀態后會釋放鎖,等待被喚醒。

二.線程獲取鎖是如何通過對象關聯monitor的?

1.在HotSpot虛擬機中,對象在內存的存儲可分為三部分:

(1)對象頭Header:Header又分為兩部分

? ? ? ? a.MarkWord:存儲對象自身運行時的數據,如HashCode、分代年齡、鎖標識等。

? ? ? ? b.KlassPoint:存儲指向對象數據類型的指針。

? ? ? ? c.如果對象是一個數組,則還會有第三部分存儲數組的長度。

(2)實例數據InstanceData:存儲對象數據,如成員變量等。

(3)填充數據PaddingData:如果對象頭加實例數據的長度不是8的整數倍,則會用填充數據填到8的整數倍,為無意義數據。

2.Java中每個對象會關聯一個Monitor對象,如果當前線程使用synchronized給對象上鎖,且是重量級鎖,則該對象的MarkWord會存儲指向其Monitor對象的指針,線程通過該指針關聯到其Monitor。

三.Monitor實現的鎖是重量級鎖,說一下鎖升級機制

1.synchronized實現的鎖都是可重入的,鎖的狀態可分為四種:

(1)無鎖

? ? ? ? a.對象未被synchronized上鎖,則是無鎖狀態。

? ? ? ? b.MarkWord存對象的HashCode、分代年齡、偏向鎖標識、鎖狀態。

(2)偏向鎖

? ? ? ? a.很長一段時間內,該鎖只會被一個線程使用,則使用偏向鎖。

? ? ? ? b.對于偏向鎖,線程第一次上鎖會通過CAS操作使對象的MarkWord關聯線程id,后續線程對該鎖的每次重入都只要比較線程id即可,無需再進行CAS操作。即多次重入僅進行一次CAS操作。

? ? ? ? c.MarkWord存鎖關聯的線程id、時間戳epoch、分代年齡、偏向鎖標識、鎖類型標識。

(3)輕量級鎖

? ? ? ? a.如果該鎖被多線程使用,但不同線程的加鎖時間基本是錯開的,即多線程對于鎖的競爭不激烈,則使用輕量級鎖。

? ? ? ? b.對于輕量級鎖,線程第一次上鎖會通過CAS操作使對象的MarkWord關聯線程的鎖記錄路,后續的每次重入也要進行CAS操作,即每次重入都要進行一次CAS操作。

? ? ? ??c.MarkWord存 指向線程棧中鎖記錄的指針、鎖類型標識。

(4)重量級鎖

? ? ? ? a.如果該鎖被多線程競爭使用,則使用重量級鎖。

? ? ? ? b.重量級鎖是通過Monitor實現的,而Monitor是jvm層面的對象,而jvm又是系統級別的,屬于內核態。因此每次操作鎖都要涉及到用戶態和內核態的切換、進程上下文的切換,成本高性能低。

? ? ? ? c.MarkWord關聯 指向Monitor對象的指針、鎖類型標識。

2.鎖升級機制

(1)對象被創建出來,未被synchronized加鎖,此時屬于無鎖狀態。

(2)當線程第一次執行到synchronized代碼塊,給對象加鎖,此時無鎖升級為偏向鎖,意為偏向于第一個加鎖的線程的鎖。若一直只有該線程使用該鎖,則該鎖一直是偏向鎖。

(3)當鎖是偏向鎖時,如果被其他線程訪問,則偏向鎖升級為輕量級鎖。輕量級鎖情況下,未競爭到鎖的線程不會進入阻塞,而是會進入自旋。

自旋:線程不斷重復未成功的操作,直至成功。若一直未成功,則一直重復失敗操作,直至成功為止,因此又稱為自旋鎖

(4)當輕量級鎖中的某個線程自旋次數達到設置的最大自旋次數時,表明鎖競爭激烈,此時輕量級鎖升級為重量級鎖。

輕量級鎖情況下:若線程未競爭到鎖,不會釋放cpu,而是會自旋,空耗cpu時間片,直到成功競爭到鎖。

重量級鎖情況下:若線程未競爭到鎖,則進入阻塞,釋放cpu。;當鎖被釋放時,由操作系統喚醒該線程。

上述四種狀態隨著鎖競爭的激烈程度不斷升級,構成鎖的升級。鎖的升級是不可逆的,只能升級不能降級。

? ? ?

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

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

相關文章

9.1 Go語言入門(環境篇)

Go語言入門(環境篇) 目錄一、什么是Go語言二、下載安裝配置Go語言開發環境1. 下載2. 安裝3. 配置環境變量4. 安裝環境驗證 三、 開發工具1. 下載2. 安裝3. 激活4. 配置SDK 四、 創建go工程文件并運行1. 創建go工程2. 示例代碼3. 運行代碼 目錄 一、什么…

軟件開源協議與QT的開源協議介紹

一.常見的六種開源協議 1.BSD協議 BSD協議全稱為“Berkely Software Distribution”,中文譯為“伯克利軟件發行版”。其最早用于伯克利UNIX操作系統上的開源貢獻。 主要特點: 允許修改源碼 允許源碼再發布 允許商業軟件發布和銷售 約束&#xff1…

shell 腳本筆記2

3.env與set區別 env用于查看系統環境變量 set用于查看系統環境變量自定義變量函數 4.常用環境變量 變量名稱含義PATH命令搜索的目錄路徑, 與windows的環境變量PATH功能一樣LANG查詢系統的字符集HISTFILE查詢當前用戶執行命令的歷史列表 Shell變量:自定義變量 目標…

HCIP【VRRP、MSTP、VLAN綜合實驗】

目錄 一、實驗拓撲圖: ?編輯二、實驗要求 三、實驗思路 四、實驗步驟 (1) eth-trunk技術配置 (2)vlan 技術配置 (3)配置SW1、SW2、AR1、ISP的IP地址 (4)在交換機…

FBB-Frontiers in Bioengineering and Biotechnology

文章目錄 一、期刊簡介二、征稿信息三、期刊表現四、投稿須知五、投稿咨詢 一、期刊簡介 Frontiers in Bioengineering and Biotechnology是專注生物工程和生物技術領域的開放獲取期刊。 研究范圍涵蓋生物材料、生物力學、生物工藝工程、生物安全和生物安保,生物傳…

QT項目-歡樂斗地主游戲

QT項目-歡樂斗地主游戲 游戲概述游戲規則牌型牌型的大小游戲角色游戲規則游戲的勝負游戲計分規則 游戲相關的類介紹卡牌類玩家類窗口類游戲控制類游戲策略類線程類音頻類 游戲主要組件卡牌玩家窗口 游戲控制源碼 游戲概述 游戲規則 不同地域游戲規則可能有些許差異&#xff0c…

MySQL之Schema與數據類型優化(三)

Schema與數據類型優化 BLOB和TEXT類型 BLOB和TEXT都是為存儲很大的數據而設計的字符串數據類型,分別采用二進制和字符方式存儲。 實際上它們分別屬于兩組不同的數據類型家族:字符類型是TINYTEXT,SMALLTEXT,TEXT,MEDIUMTEXT,LONG…

Spring Cloud整合Sentinel

1、引入依賴 鏈接: 點擊查看依賴關系 父pom <spring.cloud.version>Hoxton.SR12</spring.cloud.version> <spring.cloud.alibaba.version>2.2.10-RC1</spring.cloud.alibaba.version>Sentinel應用直接引用starter <dependency><groupId&…

【UE5.1】* 動畫重定向 (讓你的角色可以使用小白人全部動畫)

前言 這里以小白人動畫重定向給商城資產“Adventure Character”中的角色為例&#xff0c;闡述如何使用UE5.1進行動畫重定向。 步驟 1. 創建一個IK綁定 這里選擇小白人的骨骼網格體 這里命名為“IKRig_Mannequin” 2. 再新建一個IK綁定&#xff0c;這里使用你要替換給的角色…

MyBatis入門——MyBatis XML配置文件(3)

目錄 一、配置連接字符串和MyBatis 二、寫持久層代碼 1、添加 mapper 接口 2、添加 USerInfoXmlMapper.xml 3、測試類代碼 三、增刪改查操作 1、增&#xff08;Insert&#xff09; 返回自增 id 2、刪&#xff08;Delete&#xff09; 3、改&#xff08;update&#xf…

軟考--試題六--中介者模式(Mediator)

中介者模式(Meditor) 意圖 用一個中介對象來封裝一系列的對象交互。中介者使各對象不需要顯式地相互引用&#xff0c;從而使其耦合松散&#xff0c;而且可以獨立地改變它們之間的交互 結構 適用性 1、一組對象以定義良好但是復雜的方式進行通信&#xff0c;產生的相互依賴關…

民國漫畫雜志《時代漫畫》第17期.PDF

時代漫畫17.PDF: https://url03.ctfile.com/f/1779803-1248612629-85326d?p9586 (訪問密碼: 9586) 《時代漫畫》的雜志在1934年誕生了&#xff0c;截止1937年6月戰爭來臨被迫停刊共發行了39期。 ps:資源來源網絡&#xff01;

力扣HOT100 - 1143. 最長公共子序列

解題思路&#xff1a; 動態規劃 class Solution {public int longestCommonSubsequence(String text1, String text2) {int m text1.length(), n text2.length();int[][] dp new int[m 1][n 1];for (int i 1; i < m; i) {char c1 text1.charAt(i - 1);for (int j 1…

深度學習之基于YoloV5的動物識別系統

歡迎大家點贊、收藏、關注、評論啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代碼。 文章目錄 一項目簡介 二、功能三、系統四. 總結 一項目簡介 一、項目背景與目標 在生態研究、動物保護、以及畜牧業等多個領域&#xff0c;對動物進行準確、高效的識別都具有重…

形態學操作:腐蝕、膨脹、開閉運算、頂帽底帽變換、形態學梯度區別與聯系

一、總述相關概念 二、相關問題 1.形態學操作中的腐蝕和膨脹對圖像有哪些影響&#xff1f; 形態學操作中的腐蝕和膨脹是兩種常見的圖像處理技術&#xff0c;它們通過對圖像進行局部區域的像素值替換來實現對圖像形狀的修改。 腐蝕操作通常用于去除圖像中的噪聲和細小的細節&a…

單鏈表oj

練習 1. 刪除val節點 oj鏈接 這道題最先想出來的方法肯定是在遍歷鏈表的同時刪除等于val的節點&#xff0c;我們用第二中思路:不等于val的節點尾插&#xff0c;讓后返回新節點。代碼如下&#xff1a; struct ListNode* removeElements(struct ListNode* head, int val) {str…

XML基礎知識

1. 常見配置文件類型 properties文件,例如druid連接池就是使用properties文件作為配置文件 XML文件,例如Tomcat就是使用XML文件作為配置文件 YAML文件,例如SpringBoot就是使用YAML作為配置文件 json文件,通常用來做文件傳輸&#xff0c;也可以用來做前端或者移動端的配置文件…

軟考高級-信息系統項目管理師案例題選擇題做題總結

1.不應該只會建立變更和配置管理的規則&#xff0c;應該建立變更控制流程 2.變更的影響不應該只由工程師評估 3.沒有對變更和修改進行記錄 4.變更完成后&#xff0c;客戶沒有對變更進行驗證 5.變更沒有通知相關人員 6.變更沒有和配置管理關聯 7.項目變更管理的工作流程&#xf…

SOLIDWORKS科研版的介紹

SOLIDWORKS科研版的介紹 針對研究項目充分利用軟件功能&#xff0c;無任何限制訪問有關工程和科學的最新技術&#xff0c;并與世界各地的其他用戶進行交流。 SOLIDWORKS科研版可為研究人員提供有關 SOLIDWORKS 設計和科學工程技術的最新知識&#xff0c;并使他們與世界范圍內的…

08.CNN

文章目錄 Observation 1Pooling - Max PoolingFlattenApplication&#xff1a;Playing Go使用驗證集選擇模型食物分類 Observation 1 Pooling - Max Pooling Pooling主要為了降低運算量&#xff0c;現在一般不用了&#xff0c;全convolution Flatten Application&#xff1a;P…