Ну, так как каждый объект может быть заблокирован, это означает, что у каждого объекта должно быть достаточно места для хранения всей информации, которая нам нужна при блокировке.
Это довольно непривлекательно, потому что подавляющее большинство объектов никогда не будет заблокировано, поэтому мы тратим много места. Таким образом, на практике Hotspot решает эту проблему, используя 2 бита для записи состояния объекта и повторного использования остальной части заголовка объекта в зависимости от этих двух битов.
Тогда есть все смещенные / не смещенные блокирующие элементы ... ну, вы можете начать читать об этом здесь . Документация Hotspot - это не то, что я бы назвал обширной, но блокировка и заголовки объектов представлены лучше, чем большинство остальных. Но в сомнении: прочитайте исходный код.
PS: У нас аналогичная проблема с собственным хеш-кодом каждого объекта. «Просто используйте адрес памяти» не очень хорошо, если ваш GC перемешивает объекты вокруг. (Но вопреки блокировке реальной альтернативы нет - если мы хотим эту функциональность)