Частный объект блокировки и внутренняя блокировка

StackOverflow https://stackoverflow.com/questions/19840594

Вопрос

Когда предпочесть частный объект блокировки, синхронизировать блок по внутренней блокировке (это)? Пожалуйста, цитируйте аппараты обоих.

Частный объект блокировки:-

Object lock =new Object();  
synchronized(lock)
{  }

Внутренняя блокировка (это):-

synchronized(this)
{  }
Это было полезно?

Решение

Используя явное lock Объекты могут позволить различным методам синхронизировать различные замки и избегать ненужных конфликтов. Это также делает блокировку более явным и может облегчить поиск кода для блоков, которые используют блокировку.

Однако вы, вероятно, не хотите делать! Найдите соответствующий класс в java.util.concurrent и используйте его вместо этого. :)

Другие советы

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

Одной простой параллелью для понимания этой концепции является блокировка таблицы в базе данных: если вы изменяете одну таблицу, вы получаете блокировку на этой единственной таблице, а не всю базу данных, поэтому остальные таблицы могут быть изменены другими клиентами. Если вам нужно внедрить аналогичную логику, но в POJO вы бы использовали столько частных замков, сколько необходимо.

Одним из недостатков этого подхода является то, что ваш класс загроможден множеством объектов. Это может свидетельствовать о том, что вам необходимо рефакторировать его в более детальном наборе классов с более простой стратегией блокировки, но все зависит от вашего дизайна и реализации.

Они оба используют внутренние замки. Ваш первый пример - использование внутренней блокировки lock, в то время как второй использует внутреннюю блокировку this. Анкет Вопрос в том, this Это действительно то, что вы хотите зафиксировать, а это часто не так.

Рассмотрим случай, когда вы используете synchronized(this) Внутри одного из ваших методов. У вас есть 2 объекта этого класса, и эти объекты ссылаются на некоторый общий ресурс. Если вы заблокируете this Тогда у вас не будет взаимной эксклюзивности с этим ресурсом. Вам нужно заблокировать какой -то объект, к которому может получить доступ к ресурсу.

Заблокировать this Только если важный ресурс является частью самого класса. Даже тогда в некоторых случаях объект блокировки лучше. Кроме того, если в вашем классе есть несколько разных ресурсов, которые не должны быть взаимоисключающими в целом, но индивидуально, тогда вам нужно несколько объектов блокировки.

Ключ в том, чтобы просто знать, как синхронизированный работает и помните, что на самом деле делает ваш код

На самом деле, использование любого не будет иметь никакого значения, это больше о выборе/стиле, авторы API будут блокировать объект -Ко-либо синхронизированным (это) или явным синхронизированным на любом методе объекта-, или использование внутреннего монитора зависит от обмена ресурсом, вы, возможно, не хотите, чтобы пользователи API получали доступ к вашей внутренней блокировке, или вы можете дать выбор пользователям API, чтобы обмениваться объектом внутренней блокировкой.

В любом случае, ни один из этих вариантов не является неправильным, это больше о намерении такого блокировки.

Читать Ява параллелизм на практике, Это сделает вас мастером параллелизма и прояснит многие из этих концепций, которые иногда больше связаны с выбором, который вы делаете, а не правильно.

Каждый объект имеет только один внутренний замк.

С синхронизированным ключевым словом: Если вы позвоните по двум синхронизированным методам из одного и того же объекта из двух разных потоков, ровная размышления один поток может запустить метод, а другой поток может запустить второй метод, который не произойдет, потому что оба метода имеют одинаковую внутреннюю блокировку (что принадлежит к объект). И в соответствии с этим одним потоком придется ждать, пока другой поток завершит, прежде чем он сможет получить внутреннюю блокировку для запуска другого метода.

Но если вы используете несколько замков, Вы позаботите, чтобы только один поток сможет получить доступ к методу по одному, и что только один поток может получить доступ к методу два за раз. Но вы позволите этому методу один, и метод два может получить доступ к одному потоку каждый одновременно, а затем сократить время, необходимое для операции.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top