JDK15 默认关闭偏向锁优化原因
有兴趣可以阅读https://openjdk.java.net/jeps/374
先说结论
JDK15默认关闭偏向锁优化,如果要开启可以使用XX:+UseBiasedLocking,但使用偏向锁相关的参数都会触发deprecate警告
原因
1 偏向锁导致synchronization子系统的代码复杂度过高,并且影响到了其他子系统,导致难以维护、升级
2 在现在的jdk中,偏向锁带来的加锁时性能提升从整体上看并没有带来过多收益(撤销锁的成本过高 需要等待全局安全点,再暂停线程做锁撤销)
3 官方说明中有这么一段话: since the introduction of biased locking into HotSpot also change the amount of uncontended operations needed for that relation to remain true.,我个人理解是说原子指令成本变化(我理解是降低),导致自旋锁需要的原子指令次数变少(或者cas操作变少 个人理解),所以自旋锁成本下降,故偏向锁的带来的优势就更小了。
维持偏向锁的机会成本(opportunity cost)过高,所以不如废弃
个人理解,仅作学习笔记记录…
风险和假设(复制自文档)
一些java应用或许会在禁用偏向锁时有性能下降,可以通过命令行启用偏向锁来缓解。
Some Java applications may see a performance regression with biased locking disabled. Allowing biased locking to be re-enabled on the command line helps to mitigate this and provides possible insight into which situations may still benefit from its usage.
一点思考
对几乎没有锁竞争的场景来说,没有偏向锁意味着一旦加锁就是轻量级锁,这里是否有可能带来性能下降?使用juc的锁是否效率更高?