synchronized 底层实现以及什么是锁的升级、降级

本文深入探讨了Java中synchronized关键字的实现原理,介绍了Monitor对象作为同步的基本单元,并详细解析了偏斜锁、轻量级锁及重量级锁的工作机制。此外,还讨论了锁升级与降级的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

synchronized 代码块是 由一对儿 monitorenter/monitorexit 指令实现的,Monitor 对象是同步的基本实 现单元。 在 Java 6 之前,Monitor 的实现完全是依靠操作系统内部的互斥锁,因为需要 进行用户态到内核态的切换,所以同步操作是一个无差别的重量级操作。 现代的(Oracle)JDK 中,JVM 对此进行了大刀阔斧地改进,提供了三种不同 的 Monitor 实现,也就是常说的三种不同的锁:偏斜锁(Biased Locking)、 轻量级锁和重量级锁,大大改进了其性能。 所谓锁的升级、降级,就是 JVM 优化 synchronized 运行的机制,当 JVM 检测 到不同的竞争状况时,会自动切换到适合的锁实现,这种切换就是锁的升级、 降级。 当没有竞争出现时,默认会使用偏斜锁。JVM 会利用 CAS 操作(compare and swap),在对象头上的 Mark Word 部分设置线程 ID,以表示这个对象偏 向于当前线程,所以并不涉及真正的互斥锁。这样做的假设是基于在很多应用 场景中,大部分对象生命周期中最多会被一个线程锁定,使用偏斜锁可以降低 无竞争开销。 如果有另外的线程试图锁定某个已经被偏斜过的对象,JVM 就需要撤销 (revoke)偏斜锁,并切换到轻量级锁实现。轻量级锁依赖 CAS 操作 Mark Word 来试图获取锁,如果重试成功,就使用普通的轻量级锁;否则,进一步 升级为重量级锁。 我注意到有的观点认为 Java 不会进行锁降级。实际上据我所知,锁降级确实 是会发生的,当 JVM 进入安全点(SafePoint)的时候,会检查是否有闲置的 Monitor,然后试图进行降级。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值