В Java каждый экземпляр объекта имеет связанную с ним блокировку.Вам нужна ссылка на объект, чтобы выполнить синхронизированный оператор блока.Нет необходимости использовать один и тот же объект для синхронизированного блока.Вы бы прекрасно с этим справились:
private Map<String,Bar) myMap = new HashMap<String,Bar>();
private Object lockObj = new Object();
public void put( String s, Bar b ) {
synchronized( lockObj ) {
myMap.put( s,b );
// then some thing that may take a while like a database access or RPC or notifying listeners
}
}
Но теперь хитрость заключается в том, чтобы убедиться, что вы используете один и тот же объект всякий раз, когда получаете доступ к объекту myMap.Поэтому рекомендуется использовать тот же объект, с которым вы работаете, в качестве блокировки. Это используется, когда вы хотите создать небольшой синхронизированный блок и не беспокоиться о создании нового объекта для него ... это будет работатьхорошо для этого.Я надеюсь, что это помогло вам понять подход синхронизации Java.
С уважением, Тибериу