Ответ 1
Таким образом, он не обновляет значение ключа. это правильно?
Это правильно. Он вернет текущее значение, которое уже было на карте.
будет ли это лучше для добавления и обновления кеша?
Несколько вещей улучшат вашу реализацию.
1. Вы не должны использовать putIfAbsent для проверки, существует ли он, вы должны использовать его только тогда, когда хотите убедиться, что он не существует, а затем putIfAbsent
. Вместо этого вы должны использовать map.get
для проверки его существования (или map.contains).
V local = _cache.get(key);
if (local.equals(value) && !local.IsExpired()) {
return;
}
2. Вместо того, чтобы поставить вас на замену, это связано с тем, что условие гонки может происходить там, где if
может быть оценено как ложное двумя или более потоками, в которых один из двух (или более) потоков будут перезаписывать другие потоки.
Вместо этого вы можете replace
Когда все сказано и сделано, это может выглядеть так:
public void AddToCache(T key, V value) {
for (;;) {
V local = _cache.get(key);
if(local == null){
local = _cache.putIfAbsent(key, value);
if(local == null)
return;
}
if (local.equals(value) && !local.IsExpired()) {
return;
}
if (_cache.replace(key, local, value))
return;
}
}