2013-11-07 5 views
1

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

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

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

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

synchronized(this) 
{ } 
+1

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

+1

. Я думаю, что http://stackoverflow.com/questions/442564 было бы очень полезно для вас. – kiruwka

ответ

1

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

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

+0

Это верно в большинстве случаев. Тем не менее, многие библиотеки используют закрытые блокировки, например, многие коллекции и кеши Guava. Это хотя и очень низкий уровень, и вам действительно нужно знать, что вы делаете! –

0

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

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

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

0

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

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

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

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

0

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

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

Прочитайте Java Concurrency на практике, что сделает вас хозяином параллелизма и прояснит многие из этих концепций, которые иногда больше связаны с выбором, который вы делаете, а не с правильностью.

+0

Кроме того, 'synchronized (этот внутренний монитор) {...}' может быть следствием разработки более тонкой блокировки, блокировка должна выполняться только для гарантии вашей атомной операции, блокировки до ИЛИ после того, как блокировка больше не требуется. просто создайте конфликт блокировки, делающий ваше приложение медленнее. –

0

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

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

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

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

  • Нет связанных вопросов^_^