2012-12-23 3 views
-1

웹에서 동시 LRU 캐시 구현을 수행했습니다. HashMap과 동기화 된 블록이 있습니다. 내가 원한 것은 ConcurrentHashMap을 사용하고 동기화 된 블록을 사용하여 (가능한 곳에) 피하는 것이다. HashMap 대신 ConcurrentHashMap을 넣었습니다. 모든 것이 잘못되었습니다. Thread는 map.get (key)에서 종료됩니다. 어쩌면 ConcurrentHashMap의 매개 변수를 어떻게 든 사용자 정의해야합니까?ConcurrentHashMap with complicated objects

 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은 높은 수준에서 사용 된 아이디어를 설명합니다. 이 프로젝트는 presentation에 설명 된 수정 된 접근 방식을 사용하여 Guava's Cache의 기반이었습니다. 낮은 수준의 세부 사항에 관심이 있다면 두 프로젝트 모두 좋은 코드 수준 문서화 및 단원 테스트가 있습니다.