HotSpot VM重量级锁降级机制的实现原理

本文介绍了HostSpot VM内置锁的同步机制,其采用三种方式实现对象监视器并可自动切换,如偏向锁、基本锁和膨胀锁。还阐述了降级的目的和过程,JVM会在STW停顿中对空闲的重量级锁降级,可降级对象是仅能被VMThread访问的Monitor对象。

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

HostSpot VM内置锁的同步机制简述

HotSpot VM采用采用了三种不同的方式实现了对象监视器object monitor,并且可以在这三种实现方式之间进行自动切换,偏向锁通过在对象头的mark word 的oop(ordinary object pointer)中install一个thread的指针来实现了java对象对该线程的偏向,并且只有该线程能够lock该对象,但是只要是有其他线程企图锁定这个已经被偏向的对象的时候,偏向锁就不在满足这种情况了,这个时候biased locking切换成了Basic locking(基本对象),Basic locking使用CAS操作确保多个java thread在此对象锁上互斥执行,如果CAS由于竞争而失败(第二个线程试图锁定一个正在被其他线程持有的对象),这个基本对象锁因为不在满足而需要从而jvm切换到膨胀锁,objectmonitor,不想偏向锁和基本锁的实现,重量级锁的实现需要在native的heap空间中分配内存,然后指向该空间的内存指针会被装载到java对象中去,这个过程称之为膨胀。

降级的目的和过程

因为Basic locking的实现是优先于重量级锁的使用,JVM会尝试在STW的停顿中对处于“空闲(idle)”状态的重量级锁进行降级(deflate),这个降级的过程是如何实现的呢?我们知道在STW时,所有的java线程都会暂停在“safePoint”,此时VMThread通过所有Monitor的遍历,或者通过对所有依赖于MonitorInUseLists值的当前正在“使用”中的Monitor子序列进行遍历,从而得到哪些未被使用的“Monitor”作为降级对象。

可降级的Monitor对象

重量级锁的降级发生于STW阶段,降级对象及时哪些仅仅能够被VMThread访问而没有其他JavaThread访问的Monitor对象。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值