据我所知,对象的哈希码通常存储在对象的标题字中,例如,在HotSpot中可能有以下布局:
| hash code | age | 0 | 01 |
根据启用了偏向锁定的HotSpotInternals - Synchronization,标题字布局按以下方式显示:
| 0 |epoch| age | 0 | 01 |
如果在启用偏向锁定时需要实际存储哈希码,在哪里?
答案 0 :(得分:10)
我的理解是,请求(标识)哈希码可以防止偏向锁定 - 因为我们无法在标记字中存储哈希码和线程ID。如果您要求使用互斥锁的哈希码,则转移到无偏锁定模式。
以下摘自this blog:
支持此功能“最后,标记字中当前没有空格来支持标识
hashCode()
值以及偏置锁定编码所需的线程ID。鉴于此,您可以避免在通过调用System.identityHashCode(o)
来确定对象基础。如果对象已经存在偏差,则分配标识hashCode将导致撤销,否则,hashCode()
的赋值将使该对象不符合后续偏置锁定的条件。此属性为当然,我们当前实施的工件。“