之前在 System.identityHashCode() 一文中我们知道,如果生成对象的 hashCode
时对象持有偏向锁,则会撤销该偏向锁。原因为对象默认的 hashCode
与偏向锁占用了对象头中的同一片区域,是不可以同时使用的。
对象头的格式可以参考 jdk/markOop.hpp at jdk8-b120 与 Dashboard - Lilliput - Main - OpenJDK Wiki。
关于偏向锁的实现原理可以参考:Dashboard - HotSpot - Main - Runtime - Synchronization - OpenJDK Wiki,其中提到了当生成对象的默认 hashCode
时,如果存在偏向锁,则会撤销偏向锁,原文如下:
The bias is also revoked when the identity hash code of an object is accessed since the hash code bits are shared with the thread ID.
值得注意的是自 JDK 15 开始,偏向锁已经被废弃了,具体原因可以参考:JEP 374: Deprecate and Disable Biased Locking,此处不再赘述。