JDK1.8中ConcurrentHashMap中computeIfAbsent死循環bug


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

 

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

 

 

 

computeIfAbsent在1.8中才有的方法

 

 

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

debug

 

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

 

 

 

 

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

 

 

在jdk1.8和1.9中對比

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=f

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM