美文网首页
HashMap源码解析(二)

HashMap源码解析(二)

作者: 一路花开_8fab | 来源:发表于2018-09-14 20:26 被阅读0次

    由于HashMap是非线程安全的,在高并发情况下,可能会出现问题。具体表现为:程序经常占了100%的CPU,查看堆栈,你会发现程序都Hang在了HashMap.get()这个方法上了,重启程序后问题消失。但是过段时间又会来。而且,这个问题在测试环境里可能很难重现。
    这个问题的原因总结起来如下:多个线程环境下使用HashMap可能会同时进行扩容操作,结果造成环形链表,导致get方法出现死循环。下面举例进行说明。

    • 假设了我们的hash算法就是简单的用key mod 一下表的大小(也就是数组的长度)。
    • hash表的初始大小为2,线程1插入了两个元素,在扩容前,线程2又插入了一个元素,接下来,两个线程中都需要进行扩容操作。

    出现环形链表的过程请参考文档https://coolshell.cn/articles/9606.html,这里不再赘述。总结来说,就是多个线程同时进行扩容时可能会出现链表

    参考链接:
    1.https://coolshell.cn/articles/9606.html

    相关文章

      网友评论

          本文标题:HashMap源码解析(二)

          本文链接:https://www.haomeiwen.com/subject/lwragftx.html