如果在HotSpot JVM中启用了偏向锁定,那么对象的哈希码存储在何处?

时间:2013-02-05 21:56:43

标签: java jvm locking jvm-hotspot biased-locking

据我所知,对象的哈希码通常存储在对象的标题字中,例如,在HotSpot中可能有以下布局:

|  hash code  | age | 0 | 01 |

根据启用了偏向锁定的HotSpotInternals - Synchronization,标题字布局按以下方式显示:

|   0   |epoch| age | 0 | 01 |

如果在启用偏向锁定时需要实际存储哈希码,在哪里?

1 个答案:

答案 0 :(得分:10)

我的理解是,请求(标识)哈希码可以防止偏向锁定 - 因为我们无法在标记字中存储哈希码和线程ID。如果您要求使用互斥锁的哈希码,则转移到无偏锁定模式。

以下摘自this blog

支持此功能
  

“最后,标记字中当前没有空格来支持标识hashCode()值以及偏置锁定编码所需的线程ID。鉴于此,您可以避免在通过调用System.identityHashCode(o)来确定对象基础。如果对象已经存在偏差,则分配标识hashCode将导致撤销,否则,hashCode()的赋值将使该对象不符合后续偏置锁定的条件。此属性为当然,我们当前实施的工件。“