由于HashMap是非线程安全的,在高并发情况下,可能会出现问题。具体表现为:程序经常占了100%的CPU,查看堆栈,你会发现程序都Hang在了HashMap.get()这个方法上了,重启程序后问题消失。但是过段时间又会来。而且,这个问题在测试环境里可能很难重现。
这个问题的原因总结起来如下:多个线程环境下使用HashMap可能会同时进行扩容操作,结果造成环形链表,导致get方法出现死循环。下面举例进行说明。
- 假设了我们的hash算法就是简单的用key mod 一下表的大小(也就是数组的长度)。
- hash表的初始大小为2,线程1插入了两个元素,在扩容前,线程2又插入了一个元素,接下来,两个线程中都需要进行扩容操作。
出现环形链表的过程请参考文档https://coolshell.cn/articles/9606.html,这里不再赘述。总结来说,就是多个线程同时进行扩容时可能会出现链表
网友评论