我们知道hashmap在多线程下是不安全的,那么为什么不安全,这个原因是什么呢。其实核心原因在于扩容的时候多线程的参与会造成前后节点之间相互引用,造成链环,下面我们就分析下这个是怎么产生的。
我们假设一个场景:
hashmap里面就两个元素,里面其中索引1下面有两个元素:3和7,然后在扩容后为4个元素,那么扩容时候,的步骤,我们可以看下图:
单线程扩容步骤
上图为一个在扩容时候数据指向的步骤。其中每一步都是一个原子操作,不可再分
多线程扩容问题
我们这里模拟两个线程进行扩容:T1和T2
1.T1先执行了步骤1和2
线程T1执行步骤1和步骤2之后就被线程 T2 抢走了,这个时候的元素图如下图
2.T2执行步骤1、2和3
在T1执行完步骤1和2之后,T2抢到了cpu开始执行,但是这个时候hashmap还没有扩展完毕,因此,这个时候线程T2还是会继续执行扩容的操作,如果T2将步骤1、2和3全部都执行完之后,上面场景就会变成如下这样
T2执行:
执行完毕后的结果:
这个时候就形成了链环
网友评论