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
'java core' 카테고리의 다른 글
[Java 8] AtomicReference에서 만나는 ConcurrentModificationException (0) | 2014.11.13 |
---|---|
[java 8]-XX:MaxTenuringThreshold 설정값 변경 (0) | 2014.11.13 |
List.subList(fromIndex, toIndex) 실수 (0) | 2014.10.31 |
Access restriction: The type BASE64Decoder is not accessible due to restriction on required library 이슈. (0) | 2014.04.07 |
Selector.open() 호출시 NPE 발생 - jdk 7에서 해결 (0) | 2013.08.07 |