JAVA輕量級鎖簡介
概念
在某些場景下,去獲取物件鎖的時候使用CAS的方式,而不是阻塞。
輕量級鎖能夠提升程式同步效能的一句是“對於絕大部分的鎖,在整個同步週期內都是不存在競爭的”,這是一個經驗資料。
在 Java Object標頭檔案中,有一個“Mark Word”物件,它是實現輕量級鎖的關鍵。
Mark Word的資料結構非固定,根據不同的狀態會有不同的結構。
比如在32位的HotSpot虛擬機器中物件未被鎖定的狀態下,Mark Word的32bit空間中的25bit用於儲存物件雜湊碼,4bit用於儲存物件分代年齡,2bit用於儲存鎖標誌位,1bit固定為0。
其主要的幾個狀態如下:
狀態 | 標誌位 | 儲存內容 |
---|---|---|
未鎖定 | 01 | 物件雜湊碼、物件分代年齡 |
輕量級鎖定 | 00 | 指向鎖記錄的指標 |
重量級鎖定 | 10 | 指向重量級鎖的指標 |
GC標誌 | 11 | 空,不需要記錄資訊 |
可偏向 | 01 | 偏向執行緒ID、偏向時間戳,物件分代年齡 |
輕量級鎖加鎖過程
(1)在程式碼進入同步塊的時候,如果同步物件鎖狀態為無鎖狀態(鎖標誌位為“01”狀態),虛擬機器首先將在當前執行緒的棧幀中建立一個名為鎖記錄(Lock Record)的空間,用於儲存舊的Mark Word的拷貝,官方稱其為Displaced Mark Word。(鎖記錄解鎖的時候會用到)
(2)虛擬機器將使用CAS操作嘗試將物件的Mark Word更新為輕量級鎖的標誌位和指向鎖記錄(Lock Record)的指標。
(3)如果這個更新動作成功了,那麼這個執行緒就擁有了該物件的鎖。
(4)如果這個更新操作失敗了,虛擬機器首先會檢查當前執行緒是否已經擁有了這個物件的鎖,如果已經擁有,那就可以直接進入同步塊繼續執行。否則就說明這個鎖度一項已經被其他執行緒搶佔了。一旦發生這種情況,那麼輕量級鎖就會膨脹為重量級鎖。Mark Word中儲存的就會指向重量級鎖的指標,後面等待鎖的執行緒也會進入阻塞狀態。
輕量級鎖解鎖過程
(1)通過CAS操作嘗試把執行緒中複製的Displaced Mark Word物件替換當前的Mark Word。
(2)如果替換成功,整個同步過程就完成了。
(3)如果替換失敗,說明有其他執行緒嘗試過獲取該鎖,並導致該鎖變成了重量級鎖,那就要在釋放鎖的同時,喚醒被掛起的執行緒。
畫圖理解
加鎖
用New Mark Word替換Old Mark Word。
解鎖
用Displaced Mark Word替換New Mark Word。
相關文章
- java 中的鎖 -- 偏向鎖、輕量級鎖、自旋鎖、重量級鎖Java
- 【Java面試】為什麼引入偏向鎖、輕量級鎖,介紹下升級流程Java面試
- JAVA物件分析之偏向鎖、輕量級鎖、重量級鎖升級過程Java物件
- 淺談偏向鎖、輕量級鎖、重量級鎖
- 深入理解偏向鎖、輕量級鎖、重量級鎖
- java併發筆記之synchronized 偏向鎖 輕量級鎖 重量級鎖證明Java筆記synchronized
- Java併發程式設計:Synchronized底層優化(偏向鎖、輕量級鎖)Java程式設計synchronized優化
- 輕量級壓測平臺RunnerGo簡介及使用教程Go
- 【JavaSE】淺談偏向鎖、輕量級鎖和重量級鎖,如何獲取鎖,如何撤銷鎖。Java
- 死磕Synchronized底層實現–輕量級鎖synchronized
- 死磕Synchronized底層實現--輕量級鎖synchronized
- 一個輕量級WebFramework開發框架介紹WebFramework框架
- 自旋鎖、阻塞鎖、可重入鎖、悲觀鎖、樂觀鎖、讀寫鎖、偏向所、輕量級鎖、重量級鎖、鎖膨脹、物件鎖和類鎖物件
- Synchronized 輕量級鎖會自旋?好像並不是這樣的。synchronized
- 超輕量級MP4封裝方法介紹封裝
- 輕量級分散式鎖的設計原理分析與實現分散式
- 輕量級超級 css 工具CSS
- Hessian,輕量級的Java Remoting方案 (轉)JavaREM
- SqueezeNet/SqueezeNext簡述 | 輕量級網路
- PetaPoco .net 輕量級orm簡單實用教程ORM
- 輕量級UI元件 MagicUI元件
- 輕量級IOC框架:Ninject框架
- 輕量級超級簡單的element的layout柵格化佈局
- 一文讀懂原子操作、記憶體屏障、鎖(偏向鎖、輕量級鎖、重量級鎖、自旋鎖)、Disruptor、Go Context之上半部分記憶體GoContext
- 不想寫sql?試試這款輕量級JAVA ORM框架!SQLJavaORM框架
- ShuffleNetV1/V2簡述 | 輕量級網路
- C# 輕量級 ORM 框架 NPoco 的簡單應用C#ORM框架
- Flutter路由輕量級框架FRouterFlutter路由框架
- 輕量級orm框架——gzero指南ORM框架
- iOS 輕量級 HTML 解析方案iOSHTML
- 輕量級Web框架Flask(二)Web框架Flask
- [ElasticSearch ]2輕量級搜尋Elasticsearch
- 輕量級標記語言
- Magic:輕量級JavaScript UI元件JavaScriptUI元件
- 超輕量級PHP框架BroPHPPHP框架
- mysqlrouter 輕量級中介軟體MySql
- 介紹一款輕量級js控制元件:easy.jsJS控制元件
- Oracle鎖簡單介紹Oracle