死循環問題的提出: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