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!