Poison

Biased Locking

之前在 System.identityHashCode() 一文中我们知道,如果生成对象的 hashCode 时对象持有偏向锁,则会撤销该偏向锁。原因为对象默认的 hashCode 与偏向锁占用了对象头中的同一片区域,是不可以同时使用的。

对象头的格式可以参考 jdk/markOop.hpp at jdk8-b120Dashboard - 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,此处不再赘述。