2012-12-23 48 views
-1

我已經從Web上採取了一些併發的LRU緩存實現,他們有HashMap和synchronized塊。我想要的是使用ConcurrentHashMap並避免(在可能的情況下)使用同步塊。我已經把ConcurrentHashMap而不是HashMap,並且一切都出錯了。線程在map.get(key)上退出。也許我的ConcurrentHashMap的參數需要自定義?具有複雜對象的ConcurrentHashMap

 private ConcurrentHashMap<Object, LRUListEntry> map; 

     protected class LRUListEntry extends Object 
     { 
      LRUListEntry next; 
      LRUListEntry prev; 
      Object value; 
      Object key; 
      int hits; 
      final int penalty = -1; 

      public String toString() 
      { 
       return key + "=" + value; 
      } 

      public Object getKey() 
      { 
       return key; 
      } 

      public Object getValue() 
      { 
       return value; 
      } 
     } 
+3

你能更具體嗎?什麼地方出了錯? –

+0

你沒有提供相關的代碼。它不是定義值類,它是地圖的用法 – Asaf

+0

是原始實現,沒有使用ConcurrentHashMap進行測試? –

回答

2

的問題是prevnext LRU引用修訂在每次訪問重新排序項作爲最近最少使用。實現假定這些操作是以原子方式執行的,如果同步的塊被移除,則不是這樣。 Java的LinkedHashMap是您的代碼片段的不錯實現,並且在標準庫中提供。

ConcurrentLinkedHashMap提供了LRU算法的併發版本。 design document高層描述了使用的想法。該項目是Guava's Cache的基礎,使用了此presentation中描述的修改方法。如果您對底層細節感興趣,那麼這兩個項目都具有良好的代碼級文檔和單元測試。