從頭開始在Java 中實作LRU 快取
從頭開始在Java 中實現最近最少使用(LRU) 快取對於以下人員來說是一項很有價值的練習:了解資料結構和並發性。雖然像 EHCache 和 OSCache 之類的庫簡化了任務,但創建自己的庫可以讓您深入了解底層機制。
對於多執行緒環境,LinkedHashMap 成為強有力的競爭者,它提供恆定時間訪問,同時保留插入順序。然而,由於Java的標準LinkedHashMap不是線程安全的,所以常見的方法是使用Collections#synchronizedMap來包裝它。
利用並發資料結構
而LinkedHashMap具有同步功能提供了可靠的解決方案,更新的並發資料結構提供了潛在的改進。透過擴充 ConcurrentHashMap 並複製 LinkedHashMap 使用的邏輯,您可以製作高度並發的 LRU 快取。
但是,目前謹慎的做法是堅持使用經過驗證的 LinkedHashMap 和 Collections#synchronizedMap 組合。如果需要,您也可以在未來探索擴充 ConcurrentHashMap 以增強並發性。
實作片段
以下是使用 LinkedHashMap 和同步的目前實作的要點:
<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>
以上是如何用Java實現執行緒安全的LRU快取?的詳細內容。更多資訊請關注PHP中文網其他相關文章!