Synchronized锁升级

HotSpot中Mark Word存储

存储内容标志位是否偏向锁定状态
hash码、分代年龄010未锁定
偏向锁线程ID、偏向时间戳、对象分代年龄011偏向锁
指向偏向锁的指针00轻量级锁定
指向重量级锁的指针10膨胀(重量级锁)
空,不需要记录信息11GC标记

另外**

在不同版本的JVM中(如HotSpot),对象头还需要能存储对象的类型指针,指向对象的类元数据,虚拟机可以通过该信息来确定该对象是哪个类的实例。

如果对象为数组,则对象头中还要保存数组的长度信息

升级偏向锁(偏向锁的撤销)

升级的条件

当一个线程在获得锁的时候,有其他线程再来竞争锁,此时,偏向锁就会升级为轻量级锁

  1. 线程在自己的栈桢中创建锁记录 LockRecord 。
  2. 将锁对象的对象头中的MarkWord复制到线程的刚刚创建的锁记录中
  3. 将锁记录中的 Owner 指针向锁对象。
  4. 将锁对象的对象头的MarkWord替换为指向锁记录的针。

流程如下:
在这里插入图片描述

线程和对象头的布局如下:在这里插入图片描述

此时其他参与竞争锁的线程通过自旋的方式来继续获取锁,可以通过preBlockSpin参数来设置自旋的次数,也就是在经过这个次数的自旋之后任然不能获取到锁,就会膨胀为重量级锁。

轻量级锁的解锁

轻量级锁的释放逻辑其实就是过多升级偏向锁(获得轻量级锁)的逆向过程,通过cas操作把线程栈帧中的LockRecord 替换回锁对象的MarkWord中,如果成功表示没有竞争,如果失败,表示存在锁竞争,轻量级锁就会膨胀为重量级锁。

升级为重量级锁

在这里插入图片描述
升级为重量级锁后,没有获得锁的线程就会被挂起,等待当前获得锁的线程执行完,释放锁后再唤醒挂起的线程。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值