JDK1.8中ConcurrentHashMap中computeIfAbsent死循環bug

死循環問題的提出:https://bugs.openjdk.java.net/browse/JDK-8062841 java

 

        map.computeIfAbsent("AaAa",key->map.computeIfAbsent("BBBB",key2->42));

 

 

 

computeIfAbsent在1.8中才有的方法app

 

 

computeIfAbsent意思是:key不存在時候,調用mappingFunction函數結果做爲value值

debug函數

 

 兩個key的hash值同樣,跑到同一個槽裏面,而後一直在for循環判斷各個if都不符合條件spa

 

 

 

 

computeIfAbsent方法會初始化一個ReservationNode來佔位,它會等待計算完畢後替換當前的佔位對象。
這時候ConcurrentHashMap達到容量擴容而忽略了ReservationNode狀況,調用put的時候在synchronized(f)沒有對ReservationNode處理,因此會出現死循環。.net

 

 

在jdk1.8和1.9中對比debug

http://gee.cs.oswego.edu/cgi-bin/viewcvs.cgi/jsr166/src/main/java/util/concurrent/ConcurrentHashMap.java?r1=1.258&r2=1.259&sortby=date&diff_format=fcode

相關文章
相關標籤/搜索