多執行緒 HashMap 死迴圈 問題解析

2021-09-11 11:35:49 字數 657 閱讀 3765

原始碼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...