Heim >Java >javaLernprogramm >Wie implementiert man einen Thread-sicheren LRU-Cache in Java?

Wie implementiert man einen Thread-sicheren LRU-Cache in Java?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-10-29 16:42:03363Durchsuche

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

Einen LRU-Cache in Java von Grund auf implementieren

Die Implementierung eines LRU-Cache (Least Recent Used) in Java von Grund auf ist eine wertvolle Übung für Verständnis von Datenstrukturen und Parallelität. Während Bibliotheken wie EHCache und OSCache die Aufgabe vereinfachen, bietet die Erstellung eigener Bibliotheken Einblicke in die zugrunde liegenden Mechanismen.

Für Multithread-Umgebungen erweist sich LinkedHashMap als starker Konkurrent, da es einen zeitkonstanten Zugriff ermöglicht und gleichzeitig die Einfügereihenfolge beibehält. Da Javas standardmäßige LinkedHashMap jedoch nicht threadsicher ist, besteht ein gängiger Ansatz darin, sie mit Collections#synchronizedMap zu umschließen.

Nutzung gleichzeitiger Datenstrukturen

Während LinkedHashMap mit Synchronisierung bietet eine zuverlässige Lösung, neuere gleichzeitige Datenstrukturen bieten potenzielle Verbesserungen. Durch die Erweiterung von ConcurrentHashMap und die Replikation der von LinkedHashMap verwendeten Logik können Sie einen hochgradig gleichzeitigen LRU-Cache erstellen.

Vorerst ist es jedoch ratsam, bei der bewährten Kombination von LinkedHashMap und Collections#synchronizedMap zu bleiben. Bei Bedarf können Sie ConcurrentHashMap auch in Zukunft erweitern, um die Parallelität zu verbessern.

Implementierungs-Snippet

Unten finden Sie einen Überblick über die aktuelle Implementierung mit LinkedHashMap und Synchronisierung:

<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>

Das obige ist der detaillierte Inhalt vonWie implementiert man einen Thread-sicheren LRU-Cache in Java?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn