2025年Java面试宝典点击领取
(网盘链接长期有效,建议保存到自己的网盘)
Java synchronized底层实现原理

作为Java程序员在面试中,synchronized底层实现原理是高频考点。今天咱们从对象头、Monitor机制、锁升级三个维度,带大家透彻理解这个技术点。
二、对象头才是synchronized的核心载体
每个Java对象在堆内存中都包含三部分:对象头、实例数据、对齐填充。其中对象头里存储着与synchronized直接相关的数据:
- Mark Word:记录对象的hashcode、分代年龄、锁状态标记(占62位)
- Klass Pointer:指向类元数据的指针(占32/64位)
当使用synchronized给对象加锁时,JVM会根据锁状态在Mark Word中写入不同信息。例如:
- 无锁状态:记录对象的hashcode
- 偏向锁:记录持有锁的线程ID
- 轻量级锁:记录指向栈中锁记录的指针
- 重量级锁:记录指向Monitor对象的指针
三、Monitor机制如何实现线程互斥
很多面试官会追问:"既然对象头里记录了锁状态,具体是怎么实现互斥的?"这就涉及到Monitor监视器锁机制:
- 每个对象关联一个Monitor对象
- 当线程执行到同步代码时,尝试通过CAS操作获取Monitor的_owner字段
- 获取成功后,Monitor的计数器_recursions加1
- 其他线程进入_EntryList队列等待
- 释放锁时_recursions减至0,唤醒等待线程

这种机制会产生用户态与内核态的切换,所以早期synchronized被称为"重量级锁"。但在JDK6之后,JVM引入了锁升级机制进行优化。
四、锁升级过程全解析
现在的synchronized会根据竞争情况自动升级锁状态,整个过程分为四个阶段:
-
无锁状态
新创建对象时的初始状态 -
偏向锁
当只有一个线程访问时,在Mark Word中记录线程ID
(如果下次还是同一个线程,无需同步操作直接执行) -
轻量级锁
有少量线程竞争时,通过CAS自旋获取锁
(避免线程阻塞,适合短时间同步) -
重量级锁
竞争激烈时,升级为操作系统级别的互斥锁
(线程进入阻塞状态,依赖Monitor机制)

五、高频面试题拆解
Q1:synchronized锁可以降级吗?
不能主动降级,只有在没有线程竞争时才会重置为无锁状态。但偏向锁可以被撤销重置。
Q2:自旋锁和自适应自旋的区别?
- 自旋锁:固定次数的循环尝试
- 自适应自旋:根据前一次自旋成功率动态调整次数
Q3:为什么说锁升级不可逆?
因为升级是基于竞争激烈程度的判断,降级需要满足严格条件,实际场景中线程竞争往往持续存在。
掌握synchronized底层实现原理,不仅能提升面试通过率,对实际开发中的性能调优也大有帮助。如果想系统学习更多Java并发知识,可以查看2025年Java面试宝典。
悄悄说个福利:通过面试鸭返利网购买面试鸭会员,可以找我返利25元哦!覆盖大厂真题+技术原理+项目实战的会员资料,配合系统学习效果更佳。


