hashmap多线程不安全的原因

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了hashmap多线程不安全的原因相关的知识,希望对你有一定的参考价值。

参考技术A 我们知道hashmap在多线程下是不安全的,那么为什么不安全,这个原因是什么呢。其实核心原因在于扩容的时候多线程的参与会造成前后节点之间相互引用,造成链环,下面我们就分析下这个是怎么产生的。

我们假设一个场景:
hashmap里面就两个元素,里面其中索引1下面有两个元素:3和7,然后在扩容后为4个元素,那么扩容时候,的步骤,我们可以看下图:

上图为一个在扩容时候数据指向的步骤。其中每一步都是一个原子操作,不可再分

我们这里模拟两个线程进行扩容:T1和T2

线程T1执行步骤1和步骤2之后就被线程 T2 抢走了,这个时候的元素图如下图

在T1执行完步骤1和2之后,T2抢到了cpu开始执行,但是这个时候hashmap还没有扩展完毕,因此,这个时候线程T2还是会继续执行扩容的操作,如果T2将步骤1、2和3全部都执行完之后,上面场景就会变成如下这样
T2执行:

执行完毕后的结果:

这个时候就形成了链环

以上是关于hashmap多线程不安全的原因的主要内容,如果未能解决你的问题,请参考以下文章

HashMap为啥不安全?

Java并发多线程编程——集合类线程不安全之HashMap的示例及解决方案

HashMap为什么是线程不安全的?

都说知道 HashMap 线程不安全,那它为啥就不安全?

HashMap多线程不安全问题总结

HashMap线程不安全的体现