据我所知,对象的哈希码通常存储在对象的标题字中,例如,在 HotSpot 中可能具有以下布局:
| 哈希码 | 年龄 | 0 | 01 |
根据HotSpotInternals -启用了偏向锁定的同步,标题字布局如下所示:
| 0 |时代| 年龄 | 0 | 01 |
当启用偏向锁定时,如果需要,哈希码实际存储在哪里?
据我所知,对象的哈希码通常存储在对象的标题字中,例如,在 HotSpot 中可能具有以下布局:
| 哈希码 | 年龄 | 0 | 01 |
根据HotSpotInternals -启用了偏向锁定的同步,标题字布局如下所示:
| 0 |时代| 年龄 | 0 | 01 |
当启用偏向锁定时,如果需要,哈希码实际存储在哪里?
我的理解是,要求(身份)哈希码可以防止偏向锁定——因为我们不能在标记字中同时存储哈希码和线程 ID。如果您询问互斥锁的哈希码,您将转移到无偏锁定模式。
来自此博客的以下内容支持这一点:
“最后,标记字中目前没有空间来支持标识
hashCode()
值以及偏向锁定编码所需的线程 ID。鉴于此,您可以通过调用来避免基于每个对象的偏向锁定System.identityHashCode(o)
。如果对象已经有偏差,分配一个标识 hashCode 将导致撤销,否则,分配 ahashCode()
将使对象没有资格进行后续的偏差锁定。当然,这个属性是我们当前实现的产物。