2012-12-23 22 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中描述的修改方法。如果您对底层细节感兴趣,那么这两个项目都具有良好的代码级文档和单元测试。