Heim >Java >javaLernprogramm >Wie implementiert man einen LRU-Cache in Java: LinkedHashMap vs. ConcurrentHashMap?
Entwickeln eines LRU-Cache in Java
In diesem Zusammenhang geht ein LRU-Cache (Least Recent Used) davon aus, dass der am wenigsten kürzlich verwendete Cache verwendet wird Einträge haben einen geringeren Wert und können bei Bedarf verworfen werden, um die Cache-Kapazität aufrechtzuerhalten. Um dies in Java zu erreichen, betrachten wir die folgenden Ansätze:
1. LinkedHashMap mit Synchronisierung
Sie haben die Verwendung von LinkedHashMap mit Collections#synchronizedMap erwähnt. Dies ist ein gültiger Ansatz, der die integrierte doppelt verknüpfte Listenstruktur von LinkedHashMap nutzt, um das LRU-Verhalten aufrechtzuerhalten, wobei die Synchronisierung den Cache in einer Multithread-Umgebung schützt.
2. Gleichzeitige Sammlungen
Während die neuen gleichzeitigen Sammlungen eine verbesserte Leistung bieten, fehlt ihnen die integrierte LRU-Funktionalität. Daher könnte die Erweiterung der ConcurrentHashMap durch Einbindung der Logik von LinkedHashMap eine hochgradig gleichzeitige LRU-Implementierung bereitstellen.
Aktuelle Implementierung
Nach Prüfung der Vorschläge haben Sie sich für entschieden der LinkedHashMap Collections.synchronizedMap-Ansatz vorerst. Wenn Sie dies in Zukunft noch einmal betrachten, könnte die Erweiterung von ConcurrentHashMap eine praktikable Option sein.
Hier ist ein Ausschnitt Ihrer aktuellen Implementierung als Referenz:
<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; } // Check if the cache exceeds its maximum size @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>
Dieser Cache verwendet die Methode „removeEldestEntry“, um die wenigsten zu entfernen Zuletzt verwendeter Eintrag, wenn der Cache seine maximale Größe erreicht, wobei das LRU-Verhalten beibehalten wird.
Das obige ist der detaillierte Inhalt vonWie implementiert man einen LRU-Cache in Java: LinkedHashMap vs. ConcurrentHashMap?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!