Обновление кеша без влияния на латентность для доступа к кешу

codereviewanskquestions спросил: 03 февраля 2018 в 12:17 в: java

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

public class Test {    Set<Integer> cache = Sets.newConcurrentHashSet();    public boolean contain(int num) {
        return cache.contains(num);
    }    public void refresh() {
        cache.clear();
        cache.addAll(getNums());
    }
}

Итак, у меня есть фоновый поток, освежающий кеш - периодически вызовите refresh. И несколько потоков звонят contain одновременно. Я пытался избежать synchronized в подписи методов, потому что refresh может занять некоторое время (представьте, что getNum выполняет сетевые вызовы и анализирует огромные данные), затем contain будет заблокирован.

Я думаю, что этот код недостаточно хорош, потому что если contain вызывается между clear и addAll тогда contain всегда возвращает false.

Каков наилучший способ для обновления кеша, не влияя на значительную задержку на вызов contain?

0 ответов