Я смотрю на какой-то устаревший код, который имеет вид
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.
- Как синхронизированное ключевое слово оказывает влияние в этом случае?Не создается ли новая блокировка для каждого экземпляра объекта
Client
? - Не заставит ли использование ключевого слова
synchronized
обновить кэш до применения операции get / put? - Зачем нужна синхронизация до получения?Нужно ли обновлять кэш до последних значений, предполагая, что другой поток применил промежуточный результат пут.