如何通过分析 Synchronized 的锁膨胀机制理解从偏向锁到重量级锁的位状态迁移
如何通过分析 Synchronized 的锁膨胀机制理解从偏向锁到重量级锁的位状态迁移

免费影视、动漫、音乐、游戏、小说资源长期稳定更新! 👉 点此立即查看 👈
简单来说,锁的状态就藏在对象头的标记位里:偏向锁的Mark Word低3位是101,轻量级锁是000,而重量级锁则是010。识别这些位模式,并理解它们之间不可逆的迁移路径,是掌握Synchronized底层机制的关键。当然,这个过程不能光靠理论推演,必须结合字节码分析、JOL工具输出和特定的JVM参数来交叉验证。
偏向锁的 Mark Word 位模式怎么识别
偏向锁的实现,绕开了操作系统的互斥量,其奥秘全在对象头那个小小的Mark Word里。具体来说,它依赖里面的线程ID和epoch字段来做标记。当一个对象尚未被任何锁定时,它的Mark Word低3位显示为001,代表无锁状态。一旦JVM启用了偏向锁优化,并且这个对象第一次被某个线程获取,JVM就会通过CAS操作,把当前线程的ID写入Mark Word的高位区域,同时把低3位从001改为101——这个101就是偏向锁独一无二的身份证。
不过,在实际观察时,有几个坑很容易踩到:
- 直接去读
Mark Word的十六进制值,却忽略了JVM在内存中的大端/小端布局,导致位解析完全错位。 - 在已经通过
-XX:-UseBiasedLocking参数全局禁用偏向锁的环境里,还试图寻找偏向锁的行为,自然是徒劳无功。 - 使用JOL(Ja va Object Layout)这个神器来查看对象布局时,如果没加上
-XX:BiasedLockingStartupDelay=0参数,那么JVM默认会有4秒的延迟,在这期间创建的对象是不会进入偏向状态的。
轻量级锁触发时 Mark Word 怎么变化
天下没有不散的筵席,偏向锁的“独占”状态也是。当另一个线程也来尝试获取这个已经被偏向的锁时,故事就进入了下一章。JVM会首先执行偏向锁撤销(revoke),然后尝试让竞争线程走轻量级锁的流程。这个过程的核心,依然是CAS:线程会试图将自己栈帧中的锁记录(Lock Record)地址写入对象的Mark Word。如果成功,Mark Word的低3位就会从101变成000,这个000正是轻量级锁的标志。此时,对象头里存储的不再是线程ID,而是一个指向线程栈空间的指针。
这里有几个关键细节值得玩味:
- CAS失败并不意味着锁会立刻膨胀升级。失败后,线程会进入自旋(默认10次,可通过
-XX:PreBlockSpin调整),在自旋期间,Mark Word依然保持着000的轻量级锁状态。 - 如果在自旋过程中,原来持有锁的线程恰好退出了同步块,锁会被释放,
Mark Word会恢复为无锁的001。这时,自旋的线程就有机会重新竞争,甚至可能再次让对象偏向自己。 - 只有当自旋耗尽,锁依然没能获取成功,才会真正触发锁膨胀。这时,
Mark Word的内容会被替换为指向一个重量级ObjectMonitor结构的指针,其低3位也随之变为010。
重量级锁的 010 标识为什么不可逆
当你在对象头里看到010这个三位标识时,就意味着对象已经进入了重量级锁的领域。此时,Mark Word里存储的是一个指向ObjectMonitor结构的指针。这个结构由JVM在堆上专门分配,并且与操作系统底层的mutex(互斥量)相关联,因此锁操作会涉及用户态到内核态的切换,开销自然就上去了。
那么,为什么说这个过程是不可逆的呢?锁一旦升级为重量级,就再也回不去了,这背后有几个根本原因:
ObjectMonitor结构一旦创建,其内部维护的队列(如_EntryList、_WaitSet)可能已经挂载了正在阻塞等待的线程。如果此时降级,这些线程的等待状态和唤醒语义将无法得到保证,会引发混乱。- 偏向锁和轻量级锁的生命周期与线程的栈帧紧密绑定。而重量级锁的
ObjectMonitor是独立于栈帧存在的堆对象,管理域完全不同,技术上无法安全地回退到依赖栈帧的轻量级状态。 - 从JVM源码的实现来看,锁膨胀(
inflate)是一个单向的构造过程,并没有设计对应的收索(deflate)逻辑来支持降级。
怎么验证锁状态迁移过程
理论说得再透彻,不如动手验证一遍。要真正看清锁状态的迁移,不能依赖猜测或片面的日志,必须进行交叉验证,主要从三个维度入手:字节码、对象头实际数据和JVM运行时参数。
- 首先,用
ja vap -v命令反编译你的Class文件,确认同步块是否确实生成了monitorenter和monitorexit指令。 - 接着,借助JOL工具,通过
ClassLayout.parseInstance(obj).toPrintable()实时打印出对象的布局,特别是Mark Word的十六进制值。然后,你需要对照JVM源码(比如markOop.hpp文件)中的位定义表,像解码密码一样解析出每一位的含义。 - 此外,可以加上
-XX:+PrintSafepointStatistics -XX:PrintSafepointStatisticsCount=1这样的JVM参数,观察偏向锁撤销时是否会引发全局安全点(Safepoint),这对理解性能影响很有帮助。 - 最后,注意避开一些“陷阱”对象。比如容器类(
HashMap)或字符串常量池中的对象,它们内部可能默认禁用了偏向锁,在这上面测试会得不到预期的结果。
说到底,最容易忽略的一个核心点是:锁膨胀并非发生在你调用synchronized的那一刻,而是在后续线程**竞争获取锁失败时**才被触发。而且,所有的状态变更都是以单个对象为粒度的,这意味着同一个类的两个不同实例,完全可能处于截然不同的锁状态——一个可能还是无锁,另一个可能已经膨胀为重量级锁了。理解这一点,才能算真正摸清了Synchronized的脾气。
相关攻略
技嘉猎鹰白金电源系列即将发售:高效能供电新选择 对于追求极致性能的玩家和创作者来说,电源的选择往往决定了整套系统的稳定基石。好消息是,一个值得关注的新选项即将登场。技嘉科技正式宣布,其全新的EAGLE猎鹰白金与冰猎鹰白金电源系列,将于4月27日在京东平台揭开面纱。这个系列精准地覆盖了从750W到10
让行业等待了整整20天的神秘小马,今天终于正式亮相 4月27日,阿里HappyHorse 1 0正式开启灰测。官网、阿里云百炼平台、千问App三个官方入口同步开放,巨日禄、Libtv等一批第三方AI视频平台也在同一天宣布接入——这种官方渠道与第三方生态同步铺开的节奏,意味着这次不是小范围试水,而是一
4月28日,中电科思仪科技股份有限公司(下称“思仪科技”)将迎来创业板IPO上会,计划公开发行不低于9175 93万股且不超过27527 82万股。 表面上看,思仪科技报告期内业绩增长势头强劲,但深入审视其经营基本面,多重隐患已然浮现。其中,业务独立性、研发效率与募资合理性这三大核心问题,尤为值得市
全画幅标准定焦头 尼克尔 Z 50mm f 1 4售3499元 在尼康Z卡口镜头阵营里,有一支镜头的开发理念与广受好评的Z 35mm f 1 4颇有异曲同工之妙,那就是尼克尔 Z 50mm f 1 4。作为一款标准定焦镜头,它凭借f 1 4的恒定大光圈、出色的便携性以及全面的性能,成为了一个非常值得
2025年《使命召唤》遭遇滑铁卢,微软如何破局? 2025年对《使命召唤》系列而言,算得上是个“小年”。无论是营收数据,还是玩家投入的游玩时长,都在各个平台遭遇了大幅下滑,跌幅高达60%。面对这样的局面,微软显然坐不住了,已经开始着手布局,防止类似情况再次上演。而他们打出的一张关键牌,便是试图通过一
热门专题
热门推荐
霸王茶姬回应顾客喝出疑似水银物质:门店称流程不可能出现,正配合调查 近日,一则关于新茶饮的消费纠纷引发了广泛关注。据媒体报道,安徽宿州一位消费者反映,其在霸王茶姬砀山万达广场门店购买的饮品中,发现了疑似水银的液态金属物质。 根据消费者描述,事情始于饮用时尝到的异常颗粒感。随后仔细查看,竟在杯底发现了
2026款哈弗H9正式上市:硬派越野的全面进阶 4月28日,备受关注的2026款哈弗H9公布了最新动态。新车指导价定在19 99万至24 79万元区间,并推出了颇具吸引力的限时换新价——17 49万元起,顶配车型也仅需22 29万元。这个价格策略,无疑让硬派越野的门槛变得更亲民了。 外观:硬朗气场再
在Ubuntu系统中配置Ja va路径 在Ubuntu系统里配置Ja va环境,其实是个挺常见的需求。这事儿说简单也简单,核心就两步:设置好JA VA_HOME环境变量,再把Ja va的可执行文件路径加到PATH里。下面咱们就一步步来,把这事儿彻底搞定。 第一步:安装Ja va 如果你系统里还没装J
小米汽车发布五一假期专项售后服务,为车主出行保驾护航 五一假期将至,出行高峰随之而来。就在今天,小米汽车正式发布了针对2026年五一假期的专项售后服务保障方案。这项服务聚焦车主在假期出行中可能遇到的各类突发状况,推出了一系列重磅权益,覆盖了整个假期时段,从4月29日一直持续到5月6日。 此次专项服务
在Ubuntu系统中调整Ja va内存设置 在Ubuntu系统上运行Ja va应用,内存配置是个绕不开的话题。调得好,应用跑得飞快;调得不对,性能瓶颈甚至崩溃都可能找上门。好在调整方法并不复杂,关键得找准场景。下面这张图,可以帮你快速建立起一个直观的印象: 接下来,咱们就聊聊几种主流的调整路径,你可





