偏向锁与hashcode

最近在微信读书上看《Java高并发核心编程(卷2)》,看到书上有这样一句话

对象一旦生产了哈希码,它就无法进入偏向锁状态。也就是说,只要一个对象已经计算过哈希码,它就无法进入偏向锁状态,当一个对象当前正处于偏向锁状态,并且需要计算其哈希码的话,它的偏向锁会被撤销,并且锁会膨胀为重量级锁

其原因在于计算对象的hashcode采用的是随机生成的方式,而由于需要保证对象的hashcode的一致性,且对象的hashcode是懒加载的。因此当生产hashcode后会将该值塞到对象头的MarkWord里。

另一方面,锁状态为偏向锁时,MarkWord前62位需要存储偏向相关信息,这部分空间与hashcode的位数存在重复,因此二者无法共存

img

下面写一个程序来验证一下。

未重写hashcode场景

重写hashcode场景

参考

Java synchronized偏向锁后hashcode存在哪里?


偏向锁与hashcode
http://yuyangblog.cn/2023/02/07/偏向锁与hashcode/
Aŭtoro
于洋
Postigita
February 7, 2023
Lizenta