在多线程操作HashMap的情况中,可能会导致环形链表的产生。而环形链表产生后,会在后续遍历时出现死循环,导致CPU过高的情况。

以下简单描述下导致环形链表发生的情形。

假设之前链表中的数据为e1->e2->null,扩容后也在同一链表中(比如key为null与key为””的数据就在同一链表中,index为0)。

transfer代码如下:

HashMap之环形链表

线程一:执行593行的next=e.next;此时,next为e2

线程二:在线程一执行next=e.next时,已经将while执行完。此时数据表示为:

e2-e1->null;

当线程一执行后续步骤后,第一个元素为:

e1->null。

因next为e2,但e2的next已经被线程1修改为e1,此时线程一处理的下一个数据也为e1。因此线程1执行完后,的数据为:

e1->e1。

当后续要遍历该链表数据时,便会在此处产生死循环。

 

相关文章:

  • 2021-08-18
  • 2020-02-27
  • 2021-12-09
猜你喜欢
  • 2022-03-06
  • 2021-02-17
  • 2021-12-09
  • 2021-05-27
  • 2022-12-23
  • 2022-12-23
  • 2021-05-17
相关资源
相似解决方案