Maison  >  Article  >  Java  >  Comment implémenter un cache LRU Thread-Safe en Java ?

Comment implémenter un cache LRU Thread-Safe en Java ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-10-29 16:42:03358parcourir

 How to Implement a Thread-Safe LRU Cache in Java?

Implémentation d'un cache LRU en Java à partir de zéro

Implémentation d'un cache LRU (le moins récemment utilisé) en Java à partir de zéro est un exercice précieux pour comprendre les structures de données et la concurrence. Alors que des bibliothèques comme EHCache et OSCache simplifient la tâche, créer la vôtre offre un aperçu des mécanismes sous-jacents.

Pour les environnements multithread, LinkedHashMap apparaît comme un concurrent sérieux, offrant un accès en temps constant tout en préservant l'ordre d'insertion. Cependant, étant donné que le LinkedHashMap standard de Java n'est pas thread-safe, une approche courante consiste à l'envelopper à l'aide de Collections#synchronizedMap.

Exploiter les structures de données simultanées

Pendant que LinkedHashMap avec synchronisation fournit une solution fiable, les nouvelles structures de données concurrentes offrent des améliorations potentielles. En étendant ConcurrentHashMap et en répliquant la logique employée par LinkedHashMap, vous pouvez créer un cache LRU hautement concurrent.

Cependant, pour le moment, il est prudent de s'en tenir à la combinaison éprouvée de LinkedHashMap et Collections#synchronizedMap. Si vous le souhaitez, vous pouvez également explorer l'extension de ConcurrentHashMap à l'avenir pour améliorer la concurrence.

Extrait d'implémentation

Vous trouverez ci-dessous un aperçu de l'implémentation actuelle utilisant LinkedHashMap et la synchronisation :

<code class="java">private class LruCache<A, B> extends LinkedHashMap<A, B> {
    private final int maxEntries;

    public LruCache(final int maxEntries) {
        super(maxEntries + 1, 1.0f, true);
        this.maxEntries = maxEntries;
    }

    @Override
    protected boolean removeEldestEntry(final Map.Entry<A, B> eldest) {
        return super.size() > maxEntries;
    }
}

Map<String, String> example = Collections.synchronizedMap(new LruCache<String, String>(CACHE_SIZE));</code>

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn