一直知道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,一般來說,當有資料要插入時,都會檢查容量有沒有超...