Синхронизировать (это) против объекта синхронизации

В чем разница между синхронизацией объекта и синхронизацией экземпляра? А что эффективнее?

synchronize(this) {
// things to synchronize 
}

Или же

private static final Object LOCK = new Object();

synchronize(LOCK) {
// things to synchronize 
}

В одном случае вы блокируете this (текущий экземпляр), а в другом - LOCK. Не могли бы вы уточнить, в чем вы запутались?

Mark Rotteveel 11.04.2018 11:54

Множество дубликатов и литературы в SO, не говоря уже о других местах.

Mena 11.04.2018 11:55

Я не понимаю, что использовать, потому что могу заблокировать объект или экземпляр, и оба делают то же самое. Но эффективнее ли блокировать объект или экземпляр только из-за используемых ресурсов?

Fabian 11.04.2018 11:59

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

nits.kk 11.04.2018 12:38
0
4
25
0

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