原始碼resize
void resize(int newcapacity)
複製**
遷移
void transfer(entry newtable)
while (e != null);
} }
} 複製**
我們可以知道newtable 是新建立的 是執行緒私有的, 因為 執行緒1 獲取 e 和next 之後 執行緒2 插入執行了,執行完是 倒序的鏈條, 執行緒1 再插入 e 和next的 方向 與 執行緒2執行之後的 方向不對應 導致 迴圈兩次之後 出現問題,會丟資料 ,問題主要集中在最後一次(第3此)執行之後 e,next 均指向null 迴圈結束
丟資料的問題比較大,
兩個執行緒 ,
do while (e != null);
複製**
原來:3 -> 7 -> 6 -> 5( 資料5 resize的時候 分到了其他陣列 這裡不管它 )
執行緒1 在 上圖位置 卡住, e1 指向3 和 next1 指向 7
執行緒2 執行
執行後結果為 6 -> 7 -> 3 -> null
ps:沒什麼畫圖工具 手畫了一下
參考文章:
HashMap 多執行緒 死迴圈 Java
hashmap,眾所周知,是執行緒不安全的。在多執行緒的情況下,在get 非常有可能出現死迴圈。因為 hashmap採用鍊錶解決hash衝突,因為是鍊錶結構,那麼就很容易形成閉合的鏈路,這樣在迴圈的時候只要有執行緒對這個hashmap進行get操作就會產生死迴圈。只 有乙個執行緒對hashmap的資...
P說 多執行緒HashMap產生死迴圈
在1.7及以前,使用hashmap進行put操作時,當元素超過閾值時,會觸發resize操作,這時候可能就會出現死迴圈的情況,導致cpu佔用率達到100 首先,我們要先了解hashmap的資料結構,hashmap的主幹是乙個entry陣列。entry是hashmap的基本組成單元,每乙個entry包...
HashMap死迴圈問題追蹤
hashmap在設計之初並沒有考慮多執行緒併發的情況,多執行緒併發的情況下理論上應該使用concurrenthashmap,但是程式中經常會無意中在多併發的情況下使用了hashmap,如果是jdk1.8以下的版本,有可能會導致死迴圈,打滿cpu占用,下面基於jdk1.7原始碼分析下原因。我們從put...