Thread-safe cache d'un objet en java

disons que nous avons un CountryList objet dans notre application, qui doit renvoyer la liste des pays. Le chargement de pays est une opération lourde, de sorte que la liste doit être mis en cache.

Exigences supplémentaires:

  • CountryList doit être thread-safe
  • CountryList charge de paresseux (sur demande)
  • CountryList devrait soutenir l'invalidation du cache
  • CountryList doit être optimisé considérant que le cache sera invalidé très rarement

Je suis venu avec la solution suivante:

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);
    }
}

Qu'en pensez-vous? Voyez-vous quelque chose de mauvais à ce sujet? Est-il d'autres façon de le faire? Comment puis-je faire mieux? Dois-je regarder tout à fait une autre solution dans ce cas?

Grâce.

  • Je ne suis pas convaincu que c'est thread-safe. Que faire si deux threads appel invalidateCache() simultanément ou l'une est la liste d'appel() en même temps, un autre des appels invalidateCache()?
  • Cartographe retourne un "thread-safe" implementationi de l'interface de la Carte. makeComputingMap() effectue le calcul automatiquement (google-collections.googlecode.com/svn/trunk/javadoc/com/google/...)
  • voulez-vous accepter une réponse?
  • Davis, j'ai accepté ma propre réponse.
  • Integer.valueOf(1) obtient une version mise en cache de la clé.
InformationsquelleAutor Igor Mukhin | 2010-09-03