HashMap源碼分析線程不安全

HashMap 源碼分析線,爲啥線程不安全?

爲啥呢,接着往下看看。1.8版本的。
主要原因是HashMap在put的時候會導致多線程下結果不一致!
上一篇文章講解HashMap的源碼,當然麼有每個方法都講,只講了get()和put()和構造方法。剩下的自己看看就OK了,不過重點應該都涉及到了… … 吧!
進入正題!!!
現在我們來單線程的put一下 圖解:
在這裏插入圖片描述
出入完成後是這樣的
在這裏插入圖片描述
多線程下就會有問題:
假設我們有兩個線程,A線程B線程。同時插入兩對 key-value,並且通過key的計算出來hash最後幾位是相同的。也就是我要插入在數組一樣下標位置下的鏈表中。
當A線程先執行put時,A線程把紅圈的位置走完了,隨後A線程的時間片也用完了,這是B線程後起勃發一路暢通直接執行到了藍色圈或者是執行完整個方法了。這時切回到A線程繼續執行,這時A線程持有的數據都已經過期了,A線程手裏的P.next 還是空的 ,可A線程自己並不知道還是按照原路線奔跑。這時候就會出現不正確的結果。B線程的活就白乾了!!!
在這裏插入圖片描述
在這裏插入圖片描述
在之前的1.7版本中resize方法還有出現一個死循環的問題?!,不過1.8不會在有這個小問題了。
1.7 HashMap的死循環是源碼中 transfer方法中最後一句導致的 e = next;
具體原因就給大家分享兩個文章吧! 我懶了。不想寫!
https://mp.weixin.qq.com/s?__biz=MzI2NjA3NTc4Ng==&mid=2652079766&idx=1&sn=879783e0b0ebf11bf1a5767933d4e61f&chksm=f1748d73c6030465fe6b9b3fa7fc816d4704c91bfe46cb287aefccee459153d3287172d91d23&scene=21#wechat_redirect

https://blog.csdn.net/chisunhuang/article/details/79041656

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章