Sobes.tech
Back to questions
Senior
13

Как реализовать локальный кэш с потокобезопасной записью по конкретному ключу?

Companies where asked
Octo

Answer from AI

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), который также потокобезопасен.