竹笋

首页 » 问答 » 常识 » 升级到重量级锁之后就下不来了你错了
TUhjnbcbe - 2024/5/10 16:38:00

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

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

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

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

直接上实验代码。

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

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

这里有个注意点

1.8的偏向锁是会延迟生效的,得在JVM启动4秒后生效,通过

-XX:BiasedLockingStartupDelay=0关闭偏向锁延迟

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

上结果!

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

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

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

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

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

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

好了,over。

Java从入门到精通(第5版)京东月销量好评率97%无理由退换京东配送官方店¥65.5购买

最后

想要自己测试的话,引用一个jol的包即可

代码也直接拷给你们:

1
查看完整版本: 升级到重量级锁之后就下不来了你错了