淺談HashMap為什么不安全


首先是無論JDK1.7還是1.8都會產生的不安全因素:

  • put元素的時候,A線程對一個元素進行hash計算桶的索引坐標,然而正當它准備插入元素的時候,B線程被調度並且被完整執行,如果這個時候A和B線程獲得索引坐標是一樣的,那么B會插入元素形成新的鏈表,但是A線程拿到的舊鏈表信息,所以A線程執行完后會覆蓋B線程插入的元素。

另外,JDK1.7前是頭插法,1.8后變為了尾插法,這里頭插法會有一個安全隱患:

 

 [3,A],[7,B]這兩個元素我簡化表示為A,B;問題就出現在擴容的時候:

  • e = A   A.next = B,這時候e為A,插在了index = 3 的位置,正准備插入B的時候(此時 e = B),另外的線程被調度且完整的完成了擴容操作,導致 B.next = A  這個時候原來的線程繼續完成擴容的操作,插入B,然后往后遍歷 e  = B.next,然而引用信息已經被修改,B.next = A,所以該線程繼續頭插法插入A,A.next = B,如此便形成了一個環形鏈表,進入死循環。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM