WeakHashMap은 thread safe하지 않다. rehash되면서, WeakHashMap의 get() 메소드에서 cyclic reference 가 걸려서 infinite loop가 발생되는 부분이 발생한다.  



       "play-thread-160" prio=10 tid=0x000000000be3c000 nid=0x47ee runnable [0x00000000602e2000] 
  java.lang.Thread.State: RUNNABLE 
       at java.util.WeakHashMap.get(WeakHashMap.java:470) 

     


WeakHashMap의 get()의 다음 entry를 가져오는 부분에서 infinite loop가 발생했다. 


e = e.next ;



해결을 위해서는 WeakHashMap에 thread-safe하게 해주는 Collections.synchronizedMap()를 활용하거나. ConcurrentHashMap을 사용하는 것이 좋다. 저자는 WeakHashMap을 활용하는 의도가 있었기에  Collections.synchronizedMap()을 사용했고 생각보다 큰 부하는 없는 듯 하다.  



* 이해하기 좋은 자료

http://mailinator.blogspot.kr/2009/06/beautiful-race-condition.html
http://blog.wonderwall.me/?p=210

Posted by 김용환 '김용환'

댓글을 달아 주세요