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操作...