Как синхронизированное ключевое слово работает с переменной экземпляра? - PullRequest
0 голосов
/ 07 марта 2019

Я смотрю на какой-то устаревший код, который имеет вид

public class Client {
  private final Cache cache; 
  .....
   Client( final Cache cache) {
    this.cache = cache;
   }

  public Value get(Key key) {
     synchronized(cache){
       return this.cache.get(key);
     }
    }
   public void put(Key k , Value v) {
        synchronized(this.cache){
            return cache.put(k, v);
        }
    }
   }
}

Я никогда не видел переменную экземпляра, которая могла бы быть модифицирована , используемой в качестве объекта блокировки, посколькуобычно блокировки - это, как правило, конечные экземпляры объекта или просто прямые блокировки через API Java.

  1. Как синхронизированное ключевое слово оказывает влияние в этом случае?Не создается ли новая блокировка для каждого экземпляра объекта Client?
  2. Не заставит ли использование ключевого слова synchronized обновить кэш до применения операции get / put?
  3. Зачем нужна синхронизация до получения?Нужно ли обновлять кэш до последних значений, предполагая, что другой поток применил промежуточный результат пут.

1 Ответ

0 голосов
/ 12 марта 2019

synchronized предоставляет одинаковые гарантии независимо от того, используется ли он для статической переменной или переменной экземпляра. то есть видимость памяти и атомарность. В вашем случае это обеспечивает безопасность потока на уровне экземпляра для атрибута cache.

Итак, перейдем к вашим вопросам

  1. Вы правы. Каждый экземпляр Client будет иметь свою собственную блокировку. Но это полезно, когда экземпляр Client используется несколькими клиентами.

  2. После выполнения блока synchronized локальные кэши ЦП будут сбрасываться в основную память, что обеспечивает видимость памяти для других потоков. В начале выполнения блока synchronized локальные кэши ЦП будут аннулированы и загружены из основной памяти. Так что да, synchronized приведет к тому, что переменная экземпляра cache будет иметь актуальные значения. Пожалуйста, смотрите Синхронизация для более подробной информации.

  3. Причина та же, что и у 2., т. Е. Для обеспечения видимости памяти.

...