锁升级过程
# java锁升级过程
前置知识:对象头中的markword(32字节)的最后两个字节用来表示锁的状态
无锁 -> 偏向锁 -> 轻量级锁 -> 重量级锁 (无法退化)
- 无锁状态 会被标志无锁状态,jvm启动4秒后会变为偏向锁状态(
BiasedLockingStartupDelay
jvm参数 默认4秒) - 偏向锁,最后两个字节会标志为偏向锁,且还会有块内存区域标志着线程id的信息,下次线程过来时,直接将锁交出,当有竞争时,偏向锁会升级为轻量级锁
- 轻量级锁,采用的是cas操作,cas成功的线程获取到锁,其他的线程会自旋,等待锁释放,轻量级锁实现的过程是:线程的虚拟机栈中会创建一个lock record内存块用来保存对象头markword副本,对象头会记录lock record的地址,如果自旋线程数量超过一个,那么就会升级为重量级锁
- 重量级锁 jvm层面,使用monitor enter 和 monitor exist命令加锁,其他线程挂起
上次更新: 2023/06/20, 13:52:10