Где хранится хеш-код объекта, если в HotSpot JVM включена блокировка смещения?
Насколько я знаю, хеш-код объекта обычно хранится в заголовочном слове объекта, который, например, может иметь следующий макет в HotSpot:
| хэш-код | возраст | 0 | 01 |
Согласно HotSpotInternals - Синхронизация с включенной смещенной блокировкой раскладка слова заголовка выглядит следующим образом:
| 0 | эпоха | возраст | 0 | 01 |
Где же тогда хеш-код фактически сохраняется при необходимости, когда включена предвзятая блокировка?
1 ответ
Насколько я понимаю, запрос хеш-кода (идентификатора) предотвращает необъективную блокировку, поскольку мы не можем хранить как хеш-код, так и идентификатор потока в слове метки. Если вы запрашиваете хеш-код мьютекса, вы переходите в режим беспристрастной блокировки.
Это подтверждается следующим, взятым из этого блога:
"Наконец, в настоящее время в слове метки нет места для поддержки идентичности
hashCode()
значение, а также идентификатор потока, необходимый для кодирования смещенной блокировки. Учитывая это, вы можете избежать предвзятого блокирования для каждого объекта путем вызоваSystem.identityHashCode(o)
, Если объект уже смещен, присвоение идентификатора hashCode приведет к отзыву, в противном случае назначениеhashCode()
сделает объект непригодным для последующей предвзятой блокировки. Разумеется, это свойство является артефактом нашей текущей реализации ".