Java里HashMap多线程环境下可能引起的死循环的问题的测试与解决

问题

众所周知,HashMap是线程不安全的,在并发使用HashMap时很容易出现一些问题,其中最典型的就是并发情况下扩容之后会发生死循环,导致CPU占用100%。同时,这也是一个高频面试题。

原因

引发死循环的原因,是多线程环境下,HashMap在resize扩容的时候,对新数组重新rehash的时候导致的。可以看下HashMap的源码

其中,transfer方法的核心代码分为以下四个步骤:
1.Entry next = e.next;获取要转移的下一个节点next;
2.e.next = newTable[i];使用头插法将要转移的节点插入到newTable原有的单链表中;
3.newTable[i] = e;将newTable的hash桶的指针指向要转移的节点;
4.e = next;转移下一个需要转移的节点e。

测试代码

解决

使用J.U.C下面的ConcurrentHashMap代替HashMap在并发环境下也是线程安全的。

0

发表评论

邮箱地址不会被公开。