hashmap多线程不安全的原因
展开全部
我们知道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里面就两个元素,里面其中索引1下面有两个元素:3和7,然后在扩容后为4个元素,那么扩容时候,的步骤,我们可以看下图:
上图为一个在扩容时候数据指向的步骤。其中每一步都是一个原子操作,不可再分
我们这里模拟两个线程进行扩容:T1和T2
线程T1执行步骤1和步骤2之后就被线程 T2 抢走了,这个时候的元素图如下图
在T1执行完步骤1和2之后,T2抢到了cpu开始执行,但是这个时候hashmap还没有扩展完毕,因此,这个时候线程T2还是会继续执行扩容的操作,如果T2将步骤1、2和3全部都执行完之后,上面场景就会变成如下这样
T2执行:
执行完毕后的结果:
这个时候就形成了链环
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询