如何使用Java原生偏向锁与轻量级锁解析对象头锁升级流程

轻瑶大大_1047

轻瑶大大_1047

2026-06-17

273人浏览

原创

java synchronized锁升级由jvm自动管理,基于对象头mark word的位模式实现无锁→偏向锁→轻量级锁→重量级锁的单向演进,开发者需理解触发条件与状态标识而非手动控制。

如何使用java原生偏向锁与轻量级锁解析对象头锁升级流程

Java原生的synchronized锁升级流程完全由JVM自动管理,开发者无法显式“使用”偏向锁或轻量级锁,但可以通过理解对象头(特别是Mark Word)的变化,观察、验证并合理引导锁的状态演进。关键不在于手动调用,而在于掌握其触发条件、状态标识和运行时行为。

对象头锁升级的核心载体是Mark Word
每个Java对象在堆中都有一个对象头,其中Mark Word(64位JVM为64 bit,32位为32 bit)动态存储锁状态、线程ID、GC年龄等信息。锁的四种状态(无锁→偏向锁→轻量级锁→重量级锁)全部通过Mark Word中固定比特位的组合来标识,JVM依据这些位值决定如何处理synchronized请求。

偏向锁:单线程场景下的零开销优化

  • 触发时机:对象首次被某个线程进入synchronized块,且此时无竞争
  • Mark Word变化(64位JVM):
    • 原始无锁态:低2位为01,高位存hashCode或0,偏向位为0
    • 升级后:偏向位设为1,54位填入当前线程ID,低2位仍为01
  • 行为特点:该线程后续重入无需CAS,仅比对线程ID即可;其他线程尝试获取会触发偏向撤销(需STW暂停,但极短暂)

轻量级锁:多线程交替但无激烈竞争时的自旋抢锁

  • 触发时机:偏向锁被撤销(即第二个线程竞争),且未达到自旋阈值
  • Mark Word变化:低2位变为00,其余62位存指向当前线程栈帧中Lock Record的指针
  • 行为特点:
    • 线程在自己的栈上创建Lock Record,拷贝原Mark Word(Displaced Mark Word)
    • 用CAS将对象头更新为指向该Lock Record的指针
    • 若CAS失败(说明已被其他线程抢占),则自旋重试(默认最多10次,可由-XX:PretenureSizeThreshold等参数影响)

重量级锁:自旋失败或竞争加剧后的系统级阻塞

  • 触发时机:轻量级锁自旋超限、或多个线程同时争抢、或持有锁时间过长
  • Mark Word变化:低2位变为10,其余62位存指向堆中Monitor对象的指针
  • 行为特点:线程挂起,进入操作系统内核态等待队列,发生用户态→内核态切换,开销显著上升

如何实际观察与验证锁状态?

  • 使用JOL(Java Object Layout)工具打印对象头:
    System.out.println(ClassLayout.parseInstance(lock).toPrintable());

    配合-XX:+UseBiasedLocking -XX:BiasedLockingStartupDelay=0启动参数,确保偏向锁默认启用

  • 控制竞争节奏辅助观察:
    • 单线程反复synchronized(lock) → 可稳定维持偏向锁
    • 两线程错峰执行(如Thread-1 sleep后再启动Thread-2)→ 易停留在轻量级锁
    • 多线程高密度争抢(如for循环启10个线程同步操作)→ 快速膨胀至重量级锁
  • 注意:调用obj.hashCode()会使对象永久失去获得偏向锁的资格(因Mark Word需复用空间存hash,与线程ID冲突)

锁升级不可逆,且全程无代码干预点——它不是API,而是JVM基于Mark Word位模式与竞争实时决策的底层机制。真正有效的“使用”,是写出符合各锁适用场景的代码:避免无谓哈希计算、控制临界区粒度、减少锁持有时间,让JVM有空间保持在更轻量的状态。

Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南

相关专题

更多
java
java

Java是一个通用术语,用于表示Java软件及其组件,包括“Java运行时环境 (JRE)”、“Java虚拟机 (JVM)”以及“插件”。php中文网还为大家带了Java相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

2023.06.15

10697

6

java正则表达式语法
java正则表达式语法

java正则表达式语法是一种模式匹配工具,它非常有用,可以在处理文本和字符串时快速地查找、替换、验证和提取特定的模式和数据。本专题提供java正则表达式语法的相关文章、下载和专题,供大家免费下载体验。

2023.07.05

7822

9

java自学难吗
java自学难吗

Java自学并不难。Java语言相对于其他一些编程语言而言,有着较为简洁和易读的语法,本专题为大家提供java自学难吗相关的文章,大家可以免费体验。

2023.07.31

6812

8

java配置jdk环境变量
java配置jdk环境变量

Java是一种广泛使用的高级编程语言,用于开发各种类型的应用程序。为了能够在计算机上正确运行和编译Java代码,需要正确配置Java Development Kit(JDK)环境变量。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.08.01

1164

3

java保留两位小数
java保留两位小数

Java是一种广泛应用于编程领域的高级编程语言。在Java中,保留两位小数是指在进行数值计算或输出时,限制小数部分只有两位有效数字,并将多余的位数进行四舍五入或截取。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.08.02

948

3

java基本数据类型
java基本数据类型

java基本数据类型有:1、byte;2、short;3、int;4、long;5、float;6、double;7、char;8、boolean。本专题为大家提供java基本数据类型的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.02

1396

5

java有什么用
java有什么用

java可以开发应用程序、移动应用、Web应用、企业级应用、嵌入式系统等方面。本专题为大家提供java有什么用的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.02

2829

5

java在线网站
java在线网站

Java在线网站是指提供Java编程学习、实践和交流平台的网络服务。近年来,随着Java语言在软件开发领域的广泛应用,越来越多的人对Java编程感兴趣,并希望能够通过在线网站来学习和提高自己的Java编程技能。php中文网给大家带来了相关的视频、教程以及文章,欢迎大家前来学习阅读和下载。

2023.08.03

20111

3

配置java环境变量
配置java环境变量

配置Java环境变量是为了让操作系统能够识别和使用Java的相关命令和功能。本专题为大家提供配置java环境变量相关文章,帮助大家解决问题。

2023.08.03

1255

8

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
dev.java 官方:Learn Java
dev.java 官方:Learn Java

共0课时 | 0人学习

Java JDBC数据库连接官方教程
Java JDBC数据库连接官方教程

共0课时 | 0人学习