1. 程式人生 > >HashMap resize導致死循環

HashMap resize導致死循環

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導致死循環