HashMap 多執行緒 死迴圈 Java

2021-08-27 20:14:45 字數 1025 閱讀 1859

hashmap,  眾所周知,是執行緒不安全的。在多執行緒的情況下,在get() 非常有可能出現死迴圈。因為

hashmap採用鍊錶解決hash衝突,因為是鍊錶結構,那麼就很容易形成閉合的鏈路,這樣在迴圈的時候只要有執行緒對這個hashmap進行get操作就會產生死迴圈。只 有乙個執行緒對hashmap的資料結構進行操作,是不可能產生閉合的迴路的。那就只有在多執行緒併發的情況下才會出現這種情況,那就是在put操作的時候, 如果size>initialcapacity*loadfactor,那麼這時候hashmap就會進行rehash操作

public v put(k key, v value)

}modcount++;

//該key不存在,需要增加乙個結點

addentry(hash, key, value, i);

return null;

}

void addentry(int hash, k key, v value, int bucketindex)

如果現在size已經超過了threshold,那麼就要進行resize操作,新建乙個更大尺寸的hash表,然後把資料從老的hash表中遷移到新的hash表中

void resize(int newcapacity)

當table陣列容量較小,容易產生雜湊碰撞,所以,hash表的尺寸和容量非常的重要。一般來說,hash表這個容器當有資料要插入時,都會檢查容量有沒有超過設定的thredhold,如果超過,需要增大hash表的尺寸,這個過程稱為resize。

多個執行緒同時往hashmap新增新元素時,多次resize會有一定概率出現死迴圈,因為每次resize需要把舊的資料對映到新的雜湊表,這一部分**在hashmap#transfer() 方法:

void transfer(entry newtable)

while (e != null);}}

}

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

原始碼resize void resize int newcapacity 複製 遷移 void transfer entry newtable while e null 複製 我們可以知道newtable 是新建立的 是執行緒私有的,因為 執行緒1 獲取 e 和next 之後 執行緒2 插入執行了...

P說 多執行緒HashMap產生死迴圈

在1.7及以前,使用hashmap進行put操作時,當元素超過閾值時,會觸發resize操作,這時候可能就會出現死迴圈的情況,導致cpu佔用率達到100 首先,我們要先了解hashmap的資料結構,hashmap的主幹是乙個entry陣列。entry是hashmap的基本組成單元,每乙個entry包...

HashMap多執行緒下發生死迴圈的原因

由於在公司專案中偶爾會遇到hashmap死迴圈造成cpu100 重啟後問題消失,隔一段時間又會反覆出現。今天在這裡來仔細剖析下多執行緒情況下hashmap所帶來的問題 1 多執行緒put操作後,get操作導致死迴圈。2 多執行緒put非null元素後,get操作得到null值。3 多執行緒put操作...