HashMap resize導致死循環
阿新 • • 發佈:2018-08-19
ads 接下來 標註 線程二 做了 tail 假設 div hash算法
原文鏈接:https://blog.csdn.net/hll174/article/details/50915346
正常的ReHash的過程
畫了個圖做了個演示。
- 我假設了我們的hash算法就是簡單的用key mod 一下表的大小(也就是數組的長度)。
- 最上面的是old hash 表,其中的Hash表的size=2, 所以key = 3, 7, 5,在mod 2以後都沖突在table[1]這裏了。
- 接下來的三個步驟是Hash表 resize成4,然後所有的<key,value> 重新rehash的過程
並發下的Rehash
1)假設我們有兩個線程。我用紅色和淺藍色標註了一下。
而我們的線程二執行完成了。於是我們有下面的這個樣子。
註意,因為Thread1的 e 指向了key(3),而next指向了key(7),其在線程二rehash後,指向了線程二重組後的鏈表。我們可以看到鏈表的順序被反轉後。
2)線程一被調度回來執行。
- 先是執行 newTalbe[i] = e;
- 然後是e = next,導致了e指向了key(7),
- 而下一次循環的next = e.next導致了next指向了key(3)
3)一切安好。
線程一接著工作。把key(7)摘下來,放到newTable[i]的第一個,然後把e和next往下移。
4)環形鏈接出現。
e.next = newTable[i] 導致 key(3).next 指向了 key(7)
註意:此時的key(7).next 已經指向了key(3), 環形鏈表就這樣出現了。
HashMap resize導致死循環