Java锁升级过程是什么 Java偏向锁轻量级锁详解【面试】

风强小哥_4427

风强小哥_4427

2026-04-10

705人浏览

原创

java锁升级路径为无锁→偏向锁→轻量级锁→重量级锁,不可逆;依据对象头mark word中锁标志位动态判定,偏向锁首次进入同步块时cas设置线程id,轻量级锁通过栈帧lock record与cas实现自旋抢锁,超限即升级,重量级锁触发内核态阻塞。

java锁升级过程是什么 java偏向锁轻量级锁详解【面试】

锁升级到底走哪几步?路径不可逆是硬约束

Java锁升级只有一条单向路径:无锁 → 偏向锁 → 轻量级锁 → 重量级锁,且**绝不会降级**。这不是设计选择,而是JVM实现决定的——撤销偏向锁要STW(Stop-The-World),轻量级锁自旋失败后直接膨胀为重量级锁,没有“回头路”。面试答错“可降级”或漏掉“无锁”起点,基本就扣分了。

关键判断依据全在对象头的Mark Word里:32/64位中用2bit存锁标志位(如01表示偏向锁,00表示轻量级锁,10表示重量级锁),再配合1bit是否偏向锁标识。不是靠代码写法,而是JVM运行时根据竞争动态改写这个字段。

偏向锁怎么生效?别被“自动加锁”误导

偏向锁不是“一声明就上锁”,而是**首次进入同步块时触发**:JVM用一次CAS把当前线程ID写入对象头Mark Word,并设标志为01。之后同一线程再次进入,只需比对线程ID,连CAS都不用——这才是性能优势所在。

  • 失效场景很明确:第二个线程尝试获取同一把锁,就会触发偏向锁撤销(revoke);若此时原持有线程已退出同步块,撤销开销小;若还在临界区内,就得等它释放,甚至引发STW
  • 默认开启但未必适合你:高并发短生命周期对象(如RPC请求中的临时DTO),频繁撤销反而拖慢性能;可用-XX:-UseBiasedLocking全局关闭
  • 注意:静态方法、类锁(MyClass.class)默认不启用偏向锁,因为类对象生命周期长、竞争面广,JVM会跳过偏向阶段直接走轻量级锁

轻量级锁为什么叫“轻量”?自旋不是万能解药

轻量级锁本质是“用户态自旋抢锁”:线程把锁记录(Lock Record)压入自己栈帧,再用CAS把对象头指向这个记录。成功=抢到锁;失败=有竞争,进入自旋等待。

但自旋次数有硬限制——默认10次(可通过-XX:PreBlockSpin调),超限立刻升级为重量级锁。这意味着:

  • 自旋只适用于“锁持有时间极短”的场景(比如几十纳秒级的计数器更新),否则CPU空转白耗资源
  • 多个线程同时自旋?那CAS冲突率飙升,几乎必然超限升级,此时轻量级锁反而比直接上重量级锁更慢
  • 自旋期间线程不挂起,仍是RUNNABLE状态——监控看CPU高、线程数多但阻塞少,大概率就是轻量级锁自旋导致的

什么时候会卡在重量级锁?别怪synchronized慢

重量级锁本身不慢,慢的是它背后的代价:线程从RUNNABLE变为BLOCKED,需陷入内核态调用OS Mutex,再经调度器排队唤醒。一次锁争用可能带来微秒级延迟,高并发下雪崩式放大。

真正该排查的是“为何升到这一步”:

  • 检查是否真有必要同步:局部变量、ThreadLocal对象、纯计算逻辑,根本不用锁
  • 确认锁粒度:是不是整个方法用synchronized,而实际只需保护某几个字段?考虑拆成细粒度锁或java.util.concurrent原子类
  • 留意锁对象复用:多个无关业务共用同一个Object lock = new Object(),人为制造竞争——每个业务该有自己的锁对象

锁升级过程看着像自动优化,但它的每一步都暴露着代码的真实并发特征。偏爱偏向锁,说明你系统里大量串行访问;频繁走到重量级锁,那得先问自己:这里的竞争真是不可避免的吗?

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

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

2023.07.18

4867

5

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

2023.08.10

2188

6

class在c语言中的意思
class在c语言中的意思

在C语言中,"class" 是一个关键字,用于定义一个类。想了解更多class的相关内容,可以阅读本专题下面的文章。

2024.01.03

3336

7

python中class的含义
python中class的含义

本专题整合了python中class的相关内容,阅读专题下面的文章了解更多详细内容。

2025.12.06

286

9

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

2023.08.10

3638

6

word背景色怎么改成白色
word背景色怎么改成白色

Word是微软公司的一个文字处理器软件。word为用户提供了专业而优雅的文档工具,帮助用户节省时间并得到优雅美观的结果。word提供了许多易于使用的文档创建工具,同时也提供了丰富的功能供创建复杂的文档使用。怎么word背景色怎么该呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.21

4351

3

word最后一页空白页怎么删除
word最后一页空白页怎么删除

word最后一页空白页删除方法有:通过删除回车符、调整页边距、删除分节符或调整分页符位置,您可以轻松去除最后一页的空白页。根据您实际的文档情况,选择适合您的方法进行操作,使您的文档更加美观和整洁。本专题为大家提供word最后一页空白页怎么删除不了相关的各种文章、以及下载和课程。

2023.07.24

900

5

word最后一页空白页怎么删除不了
word最后一页空白页怎么删除不了

word删除最后一页空白页,可以尝试使用Backspace键删除空白页,如果无效,查找和删除分页符,或者调整页面边距和行距。还可以尝试将文档保存为其他格式并重新打开和保存。本专题为大家提供word最后一页空白页为啥删除不了的相关的文章、下载、课程内容,供大家免费下载体验。

2023.07.25

2442

5

word单页改变纸张方向
word单页改变纸张方向

word单页改变纸张方向:1、在界面上选择文档纸张方向;2、自定义页面设置;3、分节功能。本专题为大家提供word单页改变纸张方向的相关的文章、下载、课程内容,供大家免费下载体验。

2023.07.27

1140

4

热门下载

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

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.6万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 133.4万人学习