14

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

| 哈希码 | 年龄 | 0 | 01 |

根据HotSpotInternals -启用了偏向锁定的同步,标题字布局如下所示:

| 0 |时代| 年龄 | 0 | 01 |

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

4

1 回答 1

14

我的理解是,要求(身份)哈希码可以防止偏向锁定——因为我们不能在标记字中同时存储哈希码和线程 ID。如果您询问互斥锁的哈希码,您将转移到无偏锁定模式。

来自此博客的以下内容支持这一点:

“最后,标记字中目前没有空间来支持标识hashCode()值以及偏向锁定编码所需的线程 ID。鉴于此,您可以通过调用来避免基于每个对象的偏向锁定System.identityHashCode(o)。如果对象已经有偏差,分配一个标识 hashCode 将导致撤销,否则,分配 ahashCode()将使对象没有资格进行后续的偏差锁定。当然,这个属性是我们当前实现的产物。

于 2013-05-28T16:56:20.083 回答