死回圈問題的提出: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

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/63392.html
標籤:Java
下一篇:java基礎-01:dos命令
