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