Я никогда не реализовал JVM самостоятельно или даже не участвовал в его разработке, но могу представить себе компромисс.
Первая идея, которая приходит в голову связать внутреннюю блокировку с каждым объектом, заключается в том, чтобы сделать это: связать блокировку с ее состоянием (я заблокирован, по какому потоку) каждому объекту, созданному в JVM , помещенный вместе с остальной частью состояния объекта. Это должно быть эффективным. Однако он также заставляет каждый созданный объект занимать дополнительное пространство в памяти, и это пространство в большинстве случаев никогда не будет использоваться (поскольку синхронизация не является общей, и большинство объектов никогда не используются в качестве блокировки) ,
Другой идеей было бы поддерживать какой-то отдельный ленивый словарь, который создавал бы блокировку и ее состояние для объекта только тогда, когда этот объект фактически использовался как блокировка. Это очевидно для лиза и, вероятно, менее эффективно, потому что словарь нужно поддерживать параллельно с объектами и т. Д. Но он будет использовать меньше места в памяти.
Это, я думаю, компромисс (или часть компромисса), о котором говорит Брайан Гетц. Это было бы действительно менее запутанным, и реализация, вероятно, была бы проще, если бы существовали только конкретные объекты, которые могли бы действовать как блокировки.
Решение о том, что каждый объект имеет встроенный замок. Вот о чем он говорит. – Fildor
Это, я думаю, не все объекты требуют блокировки параллелизма с ними, поэтому он потребляет больше памяти. Наличие дополнительных вещей всегда влияет на производительность. Потому что вам нужно управлять ими, даже если вы их не используете. – YoungHobbit