HashMap的執行緒不安全,血的教訓!

2021-09-08 07:18:29 字數 765 閱讀 2687

一直知道hashmap是非執行緒安全的,但是它快呀。但是不知道為啥子執行緒不安全,今天,給了我當頭一棒。

因為臨近期末,所以自己搞了乙個考試系統,練一練選擇題。我的思路是這樣,乙個key,對應乙個題。

一共20道題,我debug的時候發現,當i=16的時候,原本應該map.put(16,題目),結果沒有。

key=16那一行,依舊為null。

是不是,好納悶,然後就開始去查資料,為啥子16那一行,沒東西了?

所以我直接把我學到的結論給你們吧:

1.hashmap在插入元素過多的時候需要進行resize,resize的條件是

hashmap.size >= capacity * loadfactor。

2.hashmap的resize包含擴容和rehash兩個步驟,rehash在併發的情況下可能會形成鍊錶環。

注意哦,注意哦,注意哦!!loadfactor=0.75,這個可以在debug的時候看到,這東西叫預設載入因子

比如說我的20道題,當map.size>=0.75*20=15的時候,他就要開始擴容了。

擴容的壞處就是:在多個執行緒併發擴容時,會執行transform方法轉移鍵值對時造成鍊錶成環

導致這個程式執行的時候,形成死迴圈。不是執行緒安全的!!!!!所以我16那裡就沒了,想哭。

解決方法就是,我用了hashtable來實現。乙個執行緒不安全,快,乙個執行緒安全,慢。真的是。

hashMap的執行緒不安全

hashmap是非執行緒安全的,表現在兩種情況下 1 擴容 t1執行緒對map進行擴容,此時t2執行緒來讀取資料,原本要讀取位置為2的元素,擴容後此元素位置未必是2,則出現讀取錯誤資料。2 hash碰撞 兩個執行緒新增元素發生hash碰撞,都要將此元素新增到鍊錶的頭部,則會發生資料被覆蓋。詳情 ha...

HashMap 執行緒不安全的原因

hashmap執行緒安全的問題,在各大面試中都會被問到,屬於常考熱點題目。雖然大部分讀者都了解它不是執行緒安全的,但是再深入一些,問它為什麼不是執行緒安全的,仔細說說原理,用圖畫出一種非執行緒安全的情況?1.8之後又做了什麼改善了這點?很多讀者可能一時想不出很好的答案。我們關注下面的 void tr...

談談HashMap執行緒不安全的體現

hashmap的原理以及如何實現,之前在 jdk7與jdk8中hashmap的實現 中已經說明了。那麼,為什麼說hashmap是執行緒不安全的呢?它在多執行緒環境下,會發生什麼情況呢?1.resize死迴圈 我們都知道hashmap初始容量大小為16,一般來說,當有資料要插入時,都會檢查容量有沒有超...