Потоково-безопасный кэш одного объекта в Java

скажем, у нас есть объект CountryList в нашем приложении, который должен возвращать список стран. Загрузка стран является тяжелой операцией, поэтому список следует кэшировать.

Дополнительные требования:

  • CountryList должен быть потокобезопасным
  • CountryList должен загружаться лениво (только по требованию)
  • CountryList должен поддерживать недействительность кэша
  • CountryList должен быть оптимизирован с учетом того, что кэш будет быть очень недействительным

Я нашел следующее решение:

public class CountryList {
    private static final Object ONE = new Integer(1);

    // MapMaker is from Google Collections Library    
    private Map<Object, List<String>> cache = new MapMaker()
        .initialCapacity(1)
        .makeComputingMap(
            new Function<Object, List<String>>() {
                @Override
                public List<String> apply(Object from) {
                    return loadCountryList();
                }
            });

    private List<String> loadCountryList() {
        // HEAVY OPERATION TO LOAD DATA
    }

    public List<String> list() {
        return cache.get(ONE);
    }

    public void invalidateCache() {
        cache.remove(ONE);
    }
}

Что ты думаешь об этом? Вы видите что-то плохое в этом? Есть ли другой способ сделать это? Как я могу сделать это лучше? Стоит ли искать в этом случае совершенно другое решение?

Спасибо.

37
задан Igor Mukhin 3 September 2010 в 13:40
поделиться