использование закрытой переменной для блокировки синхронизированного блока - PullRequest
0 голосов
/ 31 августа 2011

Привет! Я работаю с потоками и реализую с ними несколько простых примеров.Кроме того, я знаю, как заблокировать и использовать синхронизированный оператор, но я видел такой пример:

private List<Foo> myList = new ArrayList<Foo>();
private Map<String,Bar) myMap = new HashMap<String,Bar>();

public void put( String s, Bar b ) {
  synchronized( myMap ) {
    myMap.put( s,b );
    // then some thing that may take a while like a database access or RPC or notifying listeners
  }
}

, так как и почему переменная может использоваться в качестве блокировки синхронизированного block_ ?.Я всегда использую слово «это» для доступа к заявлению.

Ответы [ 3 ]

2 голосов
/ 31 августа 2011

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

Например, если у вас есть четыре метода, из которых два используют var1, а два других используют var2. Теперь, если вы хотите синхронизировать эти методы только на основе этих переменных, вы можете использовать переменные для блокировки вместо this.

1 голос
/ 04 сентября 2011

В 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.

С уважением, Тибериу

1 голос
/ 31 августа 2011

это указатель на текущий объект, но myMap также является объектом, экземпляром класса HashMap, который реализует интерфейс Serializable

...