Назад к вопросам
Senior
14
Как реализовать локальный кэш с потокобезопасной записью по конкретному ключу?
Компании, где спрашивали
Octo
Ответ от нейросети
sobes.tech AI
Для реализации локального кэша с потокобезопасной записью по конкретному ключу в Java можно использовать класс ConcurrentHashMap. Он обеспечивает высокую производительность при конкурентном доступе и позволяет безопасно обновлять значения по ключам.
Пример реализации кэша с потокобезопасной записью:
import java.util.concurrent.ConcurrentHashMap;
import java.util.function.Function;
public class LocalCache<K, V> {
private final ConcurrentHashMap<K, V> cache = new ConcurrentHashMap<>();
// Получить значение из кэша или вычислить и записать, если отсутствует
public V getOrCompute(K key, Function<K, V> mappingFunction) {
return cache.computeIfAbsent(key, mappingFunction);
}
// Явная запись значения по ключу
public void put(K key, V value) {
cache.put(key, value);
}
// Получить значение без вычисления
public V get(K key) {
return cache.get(key);
}
}
Метод computeIfAbsent гарантирует, что вычисление и запись значения для конкретного ключа произойдет атомарно и только один раз, даже при конкурентном доступе из нескольких потоков.
Если нужна более сложная логика обновления, можно использовать cache.compute(key, remappingFunction), который также потокобезопасен.