2015-12-22 4 views
4

Я читаю B. Goetz's Java concurrency in pratice и теперь я нахожусь в разделе о блокировке. Он сказал, чтоСинхронизация с внутренними замками

Тот факт, что каждый объект имеет встроенный замок просто удобство так, что вам не нужно явно создать замок objects.9

9 В ретроспективе, это дизайнерское решение был, вероятно, плохим: он не только путается, но и заставляет разработчиков JVM делать компромиссы между размером объекта и эффективностью блокировки.

Поскольку я новичок в параллелизме, неясно, о каком дизайнерском решении он говорил. Создание явного объекта блокировки плохо с точки зрения производительности, не так ли?

+0

Решение о том, что каждый объект имеет встроенный замок. Вот о чем он говорит. – Fildor

+1

Это, я думаю, не все объекты требуют блокировки параллелизма с ними, поэтому он потребляет больше памяти. Наличие дополнительных вещей всегда влияет на производительность. Потому что вам нужно управлять ими, даже если вы их не используете. – YoungHobbit

ответ

2

Я никогда не реализовал JVM самостоятельно или даже не участвовал в его разработке, но могу представить себе компромисс.

Первая идея, которая приходит в голову связать внутреннюю блокировку с каждым объектом, заключается в том, чтобы сделать это: связать блокировку с ее состоянием (я заблокирован, по какому потоку) каждому объекту, созданному в JVM , помещенный вместе с остальной частью состояния объекта. Это должно быть эффективным. Однако он также заставляет каждый созданный объект занимать дополнительное пространство в памяти, и это пространство в большинстве случаев никогда не будет использоваться (поскольку синхронизация не является общей, и большинство объектов никогда не используются в качестве блокировки) ,

Другой идеей было бы поддерживать какой-то отдельный ленивый словарь, который создавал бы блокировку и ее состояние для объекта только тогда, когда этот объект фактически использовался как блокировка. Это очевидно для лиза и, вероятно, менее эффективно, потому что словарь нужно поддерживать параллельно с объектами и т. Д. Но он будет использовать меньше места в памяти.

Это, я думаю, компромисс (или часть компромисса), о котором говорит Брайан Гетц. Это было бы действительно менее запутанным, и реализация, вероятно, была бы проще, если бы существовали только конкретные объекты, которые могли бы действовать как блокировки.

+0

А теперь я вижу компромисс. Большое спасибо. –

Смежные вопросы