在多线程操作HashMap的情况中,可能会导致环形链表的产生。而环形链表产生后,会在后续遍历时出现死循环,导致CPU过高的情况。
以下简单描述下导致环形链表发生的情形。
假设之前链表中的数据为e1->e2->null,扩容后也在同一链表中(比如key为null与key为””的数据就在同一链表中,index为0)。
transfer代码如下:
线程一:执行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。
当后续要遍历该链表数据时,便会在此处产生死循环。