码迷,mamicode.com
首页 > 其他好文 > 详细

HashMap resize导致死循环

时间:2018-08-18 23:31:02      阅读:195      评论:0      收藏:0      [点我收藏+]

标签:顺序   简单   做了   tail   src   步骤   过程   注意   http   

原文链接: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导致死循环

标签:顺序   简单   做了   tail   src   步骤   过程   注意   http   

原文地址:https://www.cnblogs.com/fswhq/p/hashmap.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!