偏向锁与hashcode
最近在微信读书上看《Java高并发核心编程(卷2)》,看到书上有这样一句话
对象一旦生产了哈希码,它就无法进入偏向锁状态。也就是说,只要一个对象已经计算过哈希码,它就无法进入偏向锁状态,当一个对象当前正处于偏向锁状态,并且需要计算其哈希码的话,它的偏向锁会被撤销,并且锁会膨胀为重量级锁
其原因在于计算对象的hashcode采用的是随机生成的方式,而由于需要保证对象的hashcode的一致性,且对象的hashcode是懒加载的。因此当生产hashcode后会将该值塞到对象头的MarkWord里。
另一方面,锁状态为偏向锁时,MarkWord前62位需要存储偏向相关信息,这部分空间与hashcode的位数存在重复,因此二者无法共存
下面写一个程序来验证一下。
参考
偏向锁与hashcode
http://yuyangblog.cn/2023/02/07/偏向锁与hashcode/