美文网首页
hashmap多线程不安全的原因

hashmap多线程不安全的原因

作者: 老柿子 | 来源:发表于2018-10-27 12:53 被阅读27次

我们知道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执行:

执行完毕后的结果:

这个时候就形成了链环

相关文章

  • hashmap多线程不安全的原因

    我们知道hashmap在多线程下是不安全的,那么为什么不安全,这个原因是什么呢。其实核心原因在于扩容的时候多线程的...

  • 关于HashMap 、HashTable and Concur

    线程不安全的HashMap 多线程环境下使用HashMap会引起死循环,原因就在于HashMap底层数据结构是有一...

  • HashMap 与 ConcurrentHashMap

    HashMap 与 ConcurrentHashMap 一、背景: 线程不安全的HashMap:因为多线程环境下,...

  • Java并发-20.ConcurrentHashMap

    0. HashMap和HashTable HashMap线程不安全多线程下HashMap的put操作可能导致Ent...

  • Java基础篇-HashMap多线程问题

    常会说到HashMap在多线程下是不安全的,那么不安全会引起什么问题呢? 多线程下,对一个HashMap进行修改时...

  • Java基础之ConcurrentHashMap

    HashMap存在的问题: HashMap线程不安全 因为多线程环境下,使用Hashmap进行put操作可能会引起...

  • java.util.concurrent ConcurrentH

    HashMap存在的问题: HashMap线程不安全 因为多线程环境下,使用Hashmap进行put操作可能会引起...

  • ConcurrentHashMap

    为神什么要使用ConcurrentHashMap?hashMap线程不安全在多线程环境下,使用HashMap进行p...

  • Java多线程(10)

    Java多线程(10) 非阻塞队列 ConcurrentHashMap HashMap在多线程条件下的不安全性: ...

  • ConcurrentHashMap

    总结 HashMap在多线程中不安全,java提供了线程安全的ConcurrentHashMap 类,保证在多线程...

网友评论

      本文标题:hashmap多线程不安全的原因

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