Synchronized 升级到重量级锁之后就下不来了?你错了!
你好,我是 yes。 昨天的一篇关于 Synchronized 的一个点,网上99%的文章都错了发了之后有很多读者私聊我,感觉打破了对轻量级锁升级的一个认知。 然后有一位读者的留言倒是提醒到我还有一个点,关于 Synchronized 的这个点,可能很多人的认识也是错误的。 其实以前我的认识也是错误的,直至去年和另一位号主安琪拉讨论的时候才意识到这个问题。 我们都知道 synchronized 的锁升级,也听过锁升级之后不会降级,所以理所当然的认为当一个锁升级为重量级锁之后,任何线程再来争抢之后会走重量级锁的逻辑。 不会再从无锁到偏向锁到轻量级锁再到重量级锁。 那事实是怎样的呢?这篇咱们不看源码,直接整结果。 我们直接看锁对象的锁标志来判断。 直接上实验代码。 代码非常简单,先看下无锁的对象布局,然后多线程争抢此时应该是重量级锁,然后 sleep 等待所有线程执行完毕释放锁,然后再看看此时的锁布局。 最后再加一次锁看看对象布局。 这里有个注意点 1.8 的偏向锁是会延迟生效的,得在 JVM 启动 4 秒后生效,通过 -XX:BiasedLockingStartupDelay=0关闭偏向...





