java core
WeakHashMap을 thread-safe하게 하기 (WeakHashMap의 무한루프(infinite loop) 해결하기)
'김용환'
2014. 11. 5. 11:24
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)
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