Synchronized升级成重量级锁之后就下不来了?你错了

我们都知道 synchronized 的锁升级,也听过锁升级之后不会降级,所以理所当然的认为当一个锁升级为重量级锁之后,任何线程再来争抢之后会走重量级锁的逻辑。

不会再从无锁到偏向锁到轻量级锁再到重量级锁。

那事实是怎样的呢?这篇咱们不看源码,直接整结果。

我们直接看锁对象的锁标志来判断。

在这里插入图片描述

直接上实验代码。

在这里插入图片描述

代码非常简单,先看下无锁的对象布局,然后多线程争抢此时应该是重量级锁,然后 sleep 等待所有线程执行完毕释放锁,然后再看看此时的锁布局。

最后再加一次锁看看对象布局。

这里有个注意点

1.8 的偏向锁是会延迟生效的,得在 JVM 启动 4 秒后生效,通过 -XX:BiasedLockingStartupDelay=0关闭偏向锁延迟

这边我没搞这个参数,因为不是重点,所以等下结果里面不会有偏向锁。

上结果!

在这里插入图片描述

结果显而易见,初始是无锁的。

然后4个线程同时竞争变成了重量级锁。

4个线程执行完毕之后,锁对象变成了无锁。

此时再有一个线程去争抢锁,就从无锁变成了轻量级锁。

所以当重量级锁释放了之后,锁对象是无锁的!

有新的线程来竞争的话又会从轻量级锁开始!

至于为什么有人说锁不能降级,是因为有一个必要的前提条件:“在锁竞争的过程中”。并非锁释放之后,还不能降级!!!
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值