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
- 深入理解偏向鎖、輕量級鎖、重量級鎖
- 輕量級壓測平臺RunnerGo簡介及使用教程Go
- 【JavaSE】淺談偏向鎖、輕量級鎖和重量級鎖,如何獲取鎖,如何撤銷鎖。Java
- 死磕Synchronized底層實現--輕量級鎖synchronized
- 死磕Synchronized底層實現–輕量級鎖synchronized
- SqueezeNet/SqueezeNext簡述 | 輕量級網路
- 一句話擼完重量級鎖、自旋鎖、輕量級鎖、偏向鎖、悲觀、樂觀鎖等各種鎖
- 自旋鎖、阻塞鎖、可重入鎖、悲觀鎖、樂觀鎖、讀寫鎖、偏向所、輕量級鎖、重量級鎖、鎖膨脹、物件鎖和類鎖物件
- Synchronized 輕量級鎖會自旋?好像並不是這樣的。synchronized
- PetaPoco .net 輕量級orm簡單實用教程ORM
- 超輕量級MP4封裝方法介紹封裝
- 輕量級分散式鎖的設計原理分析與實現分散式
- 輕量級超級 css 工具CSS
- 一文讀懂原子操作、記憶體屏障、鎖(偏向鎖、輕量級鎖、重量級鎖、自旋鎖)、Disruptor、Go Context之上半部分記憶體GoContext
- Javalin2.4.0釋出,Kotlin/Java輕量級Web框架JavaKotlinWeb框架
- 輕量級超級簡單的element的layout柵格化佈局
- ShuffleNetV1/V2簡述 | 輕量級網路
- C# 輕量級 ORM 框架 NPoco 的簡單應用C#ORM框架
- mysql鎖之三種行級鎖介紹MySql
- JAVA簡介Java
- 不想寫sql?試試這款輕量級JAVA ORM框架!SQLJavaORM框架
- 輕量級網站建設jsonp跨域簡單例項網站JSON跨域單例
- 輕鬆搞懂Java中的自旋鎖Java
- 輕量級配置中心Nodejs版NodeJS
- iOS 輕量級 HTML 解析方案iOSHTML
- python輕量級效能工具-LocustPython
- Flutter路由輕量級框架FRouterFlutter路由框架
- 輕量級orm框架——gzero指南ORM框架
- Spring的輕量級實現Spring
- 輕量級Web框架Flask(二)Web框架Flask
- Oracle釋出開源的輕量級 Java 微服務框架 HelidonOracleJava微服務框架
- 《真·簡單》Golang 輕量級桌面程式 wails 庫(聖誕節限定)GolangAI
- Java 11簡介Java
- java JNI簡介Java