今天看视频看到的一个知识点,关于synchronized锁降级

/ 后端 / 没有评论 / 377浏览

问题:

synchronized的锁强度依次为:无锁状态、偏向锁状态、轻量级锁、重量级锁,会随着多线程的竞争强度逐渐升级。这个是众所周知的,最近在看《并发编程的艺术》中提到了锁只能升级而无法降级,但是我记得在之前的某些资料中看到过:锁是可以降级的,只不过条件比较苛刻。不知道对于此有什么具体的权威的资料可以参考呢?


答案:

这玩意儿并没有 JDK 标准,完全看各家 JVM 是咋实现的了。

像 HotSpot JVM 其实就支持锁降级,但是锁升降级效率较低,如果频繁升降级的话对性能就会造成很大影响。重量级锁降级发生于 STW 阶段,降级对象为仅仅能被 VMThread 访问而没有其他 JavaThread 访问的对象。

被锁的对象都被垃圾回收了有没有锁还有啥关系?因此基本认为锁不可降级。

原文:

In its current implementation, monitor deflation is performed during every STW pause, while all Java threads are waiting at a safepoint. We have seen safepoint cleanup stalls up to 200ms on monitor-heavy-applications.