Rumah  >  Artikel  >  Java  >  Bagaimana untuk Melaksanakan Cache LRU dalam Java: LinkedHashMap vs. ConcurrentHashMap?

Bagaimana untuk Melaksanakan Cache LRU dalam Java: LinkedHashMap vs. ConcurrentHashMap?

Patricia Arquette
Patricia Arquetteasal
2024-10-28 03:13:02242semak imbas

How to Implement an LRU Cache in Java: LinkedHashMap vs. ConcurrentHashMap?

Membangunkan Cache LRU di Java

Dalam konteks ini, cache LRU (Paling Kurang Digunakan) membuat andaian bahawa yang paling kurang digunakan baru-baru ini entri memegang kurang nilai dan boleh dibuang apabila perlu untuk mengekalkan kapasiti cache. Untuk mencapai ini di Jawa, mari kita pertimbangkan pendekatan berikut:

1. LinkedHashMap dengan Penyegerakan

Anda telah menyebut menggunakan LinkedHashMap dengan Collections#synchronizedMap. Ini adalah pendekatan yang sah, menggunakan struktur senarai pautan berganda terbina dalam LinkedHashMap untuk mengekalkan gelagat LRU, dengan penyegerakan melindungi cache dalam persekitaran berbilang benang.

2. Koleksi Serentak

Walaupun koleksi serentak baharu menawarkan prestasi yang lebih baik, koleksi serentak itu tidak mempunyai fungsi LRU terbina dalam. Oleh itu, memanjangkan ConcurrentHashMap, dengan menggabungkan logik LinkedHashMap, boleh memberikan pelaksanaan LRU yang sangat serentak.

Pelaksanaan Semasa

Selepas mempertimbangkan cadangan, anda telah memilih untuk pendekatan LinkedHashMap Collections.synchronizedMap buat masa ini. Apabila menyemak semula perkara ini pada masa hadapan, melanjutkan ConcurrentHashMap mungkin merupakan pilihan yang berdaya maju.

Berikut ialah coretan pelaksanaan semasa anda untuk rujukan:

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

Cache ini menggunakan kaedah removeEldestEntry untuk mengalih keluar sekurang-kurangnya entri yang digunakan baru-baru ini apabila cache mencapai saiz maksimumnya, mengekalkan gelagat LRU.

Atas ialah kandungan terperinci Bagaimana untuk Melaksanakan Cache LRU dalam Java: LinkedHashMap vs. ConcurrentHashMap?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn