Нет, synchronized
не «блокирует объекты». Что делает ваш блок кода, требуется поток для блокировки hashMap1, прежде чем он сможет войти в блок. hashMap1 сам по себе не «заблокирован», за исключением того, что его монитор приобретается. (Может быть, лучше назвать это монитором, чем блокировкой). Монитор - это то, что все объекты имеют, сам по себе он не делает ничего, чтобы контролировать доступ к объекту, к которому он принадлежит. Если hashMap2 доступен в другом месте, этот синхронизированный блок не делает ничего, чтобы это предотвратить.
Назначение синхронизированного блока - потребовать, чтобы поток приобрел монитор. Во всех местах, где вы хотите, чтобы этот ресурс был защищен от одновременного доступа, требуется потребовать принятия той же блокировки. Это блоки кода, защищенные с помощью synchronized
, указывающие, когда нужно использовать объект блокировки, который контролирует доступ.
Выбор монитора может храниться отдельно от реальных объектов, защищенных от одновременного доступа. У вас может быть выделенный объект блокировки и использовать его, нет требования, чтобы вы использовали блокировку для защищаемых вами вещей. (Единственным преимуществом является то, что могло бы помочь в организации, если есть только одна вещь, которую вы обращаетесь, может быть удобно использовать монитор, который вещь.) Используя специальный замок может быть яснее:
public class Foo {
private final Object LOCK = new Object();
private Map hashMap1 = new HashMap();
private Map hashMap2 = new HashMap();
public void doStuff() {
synchronized(LOCK) {
... // do stuff with hashMap1 and hashMap2
}
}
}
Сохраняя доступ к блокировка, закрытая для объекта, означает, что объект может ограничить, кто может получить блокировку (в отличие от synchronized(this)
). Также не используйте такие вещи, как «Строки» или «Булевы», которые могут быть интернированы, кэшированы или иным образом доступны из других частей программы.
Или использовать третий объект для блокировки обоих. Остерегайтесь блокировки тупиков ... – vikingsteve
@vikingsteve Хорошая точка, это действительно может быть лучше. –