轻量级锁在竞争加剧时会升级为重量级锁;当自旋次数达阈值(默认10次)仍抢锁失败,jvm触发锁膨胀,将mark word替换为指向objectmonitor的指针,标志位由00变为10,此后不可降级且所有竞争线程进入内核态阻塞。

轻量级锁在竞争加剧时,会主动放弃自旋等待,升级为重量级锁。
轻量级锁的自旋尝试有明确阈值
当多个线程同时竞争同一把轻量级锁时,未获取到锁的线程不会立即阻塞,而是进入自旋状态——即在用户态反复执行CAS操作尝试抢锁。但JVM对自旋次数做了限制:
- 默认自旋次数通常为10次(具体由-XX:PretenureSizeThreshold等参数影响,实际受JVM版本和运行时策略调控)
- 若在限定次数内仍无法成功获取锁,线程将停止自旋
- 此时JVM判定“竞争已加剧”,触发锁膨胀(Lock Inflation)
升级过程伴随对象头Mark Word重写
轻量级锁升级为重量级锁不是简单标记切换,而是底层结构的实质性变更:
Java Linux版下载入口,提供 Oracle JDK 26.0.2 官方 Linux 安装包、Java 环境配置、JDBC 数据库连接和 Java 服务端开发相关信息。
- 原轻量级锁状态下,Mark Word存储的是指向栈中Lock Record的指针(锁标志位为00)
- 升级时,JVM会为该对象创建ObjectMonitor(监视器),并将Mark Word替换为指向该monitor的指针
- 锁标志位从00变为10,表示进入重量级锁定状态
- 所有后续争抢线程将被挂起,进入操作系统级阻塞队列
升级后不再降级,且影响所有后续竞争
锁升级是单向不可逆的:
- 一旦膨胀为重量级锁,该对象在整个生命周期内都保持重量级锁状态
- 即使之后竞争消失、只剩单一线程访问,也不会回退到轻量级或偏向锁
- 后续所有synchronized操作都将走ObjectMonitor路径,涉及用户态/内核态切换
典型触发场景容易被忽略
并非只有“大量线程同时抢锁”才会触发升级,以下情况同样会导致轻量级锁快速膨胀:
- 两个线程交替执行但时间窗口重叠(如sleep间隔过短)
- 自旋期间发生线程调度(例如OS强制切出CPU),导致自旋失效
- 锁内执行耗时操作(如I/O、长循环),延长持有时间,增加冲突概率
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










