问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

HashMap为什么不安全?

发布网友 发布时间:2022-05-07 03:10

我来回答

12个回答

热心网友 时间:2023-01-27 06:53

我们都知道HashMap是线程不安全的,在多线程环境中不建议使用,但是其线程不安全主要体现在什么地方呢,本文将对该问题进行解密。

1.jdk1.7中的HashMap

在jdk1.8中对HashMap做了很多优化,这里先分析在jdk1.7中的问题,相信大家都知道在jdk1.7多线程环境下HashMap容易出现死循环,这里我们先用代码来模拟出现死循环的情况:

public class HashMapTest {    public static void main(String[] args) {        HashMapThread thread0 = new HashMapThread();        HashMapThread thread1 = new HashMapThread();        HashMapThread thread2 = new HashMapThread();        HashMapThread thread3 = new HashMapThread();        HashMapThread thread4 = new HashMapThread();        thread0.start();        thread1.start();        thread2.start();        thread3.start();        thread4.start();    }}class HashMapThread extends Thread {    private static AtomicInteger ai = new AtomicInteger();    private static Map map = new HashMap<>();    @Override    public void run() {        while (ai.get() < 1000000) {            map.put(ai.get(), ai.get());            ai.incrementAndGet();        }    }}

上述代码比较简单,就是开多个线程不断进行put操作,并且HashMap与AtomicInteger都是全局共享的。

在多运行几次该代码后,出现如下死循环情形:

其中有几次还会出现数组越界的情况:

这里我们着重分析为什么会出现死循环的情况,通过jps和jstack命名查看死循环情况,结果如下:

从堆栈信息中可以看到出现死循环的位置,通过该信息可明确知道死循环发生在HashMap的扩容函数中,根源在transfer函数中,jdk1.7中HashMap的transfer函数如下:

void transfer(Entry[] newTable, boolean rehash) {        int newCapacity = newTable.length;        for (Entry e : table) {            while(null != e) {                Entry next = e.next;                if (rehash) {                    e.hash = null == e.key ? 0 : hash(e.key);                }                int i = indexFor(e.hash, newCapacity);                e.next = newTable[i];                newTable[i] = e;                e = next;            }        }    }

总结下该函数的主要作用:

在对table进行扩容到newTable后,需要将原来数据转移到newTable中,注意10-12行代码,这里可以看出在转移元素的过程中,使用的是头插法,也就是链表的顺序会翻转,这里也是形成死循环的关键点。

下面进行详细分析。

1.1 扩容造成死循环分析过程

前提条件,这里假设:

热心网友 时间:2023-01-27 08:11

赌气呢,就是写给你看的。女孩子要给男孩点台阶下,下次再哄你,就别那么倔了。有机会给他点暗示吧,会回来找你的。

热心网友 时间:2023-01-27 09:45

HashMap底层是一个Entry数组,当发生hash冲突的时候,hashmap是采用链表的方式来解决的,在对应的数组位置存放链表的头结点

热心网友 时间:2023-01-27 11:37

无论做什么事,都要先考虑自己是否能那个本事去挑大梁,所以不要高估了自己,也不要瞧不起别人。

热心网友 时间:2023-01-27 13:45

HashMap之所以线程不安全,就是resize这里出的问题。
HashMap在put的时候,插入的元素超过了容量(由负载因子决定)的范围就会触发resize扩容操作,扩容操作中,在多线程的环境下,存在同时其他的元素也在进行扩容过程的put操作,可能会导致 原来的链表形成一个循环链表, 然后进行get操作时 就可能引起死循环(cpu100%)
————————————————
版权声明:本文为CSDN博主「小码哥222」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_38737586/article/details/100150008

热心网友 时间:2023-01-27 16:09

.Map概述 我们都知道HashMap是线程不安全的,但是HashMap的使用频率在所有map中确实属于比较高的。因为它可以满足我们大多数的场景了。 Map类继承图 复制代码 Map是一个接口,我们常用的实现类...
2.HashMap的实现 java7和java8在实现HashMap上有所区别,当然java8的效率要更好一些,主要是java8的HashMap在java7的基础上增加了红黑树这种数据结构,使得在桶里面查找数据的...

热心网友 时间:2023-01-27 18:51

HashMap会进行resize操作,在resize操作的时候会造成线程不安全

热心网友 时间:2023-01-27 21:49

1.Map概述 我们都知道HashMap是线程不安全的,但是HashMap的使用频率在所有map中确实属于比较高的。因为它可以满足我们大多数的场景了。 Map类继承图 复制代码 Map是一个接口,我们常用的实现类...

热心网友 时间:2023-01-28 01:03

Map概述 我们都知道HashMap是线程不安全的,但是HashMap的使用频率在所有map中确实属于比较高的。因为它可以满足我们大多数的场景了。 Map类继承图 复制代码 Map是一个接口,我们常用的实现类

热心网友 时间:2023-01-28 04:35

不安全
1.
Map概述 我们都知道HashMap是线程不安全的,但是HashMap的使用频率在所有map中确实属于比较高的。因为它可以满足我们大多数的场景了。 Map类继承图 复制代码 Map是一个接口,我们常用的实现类...
2.
HashMap的实现 java7和java8在实现HashMap上有所区别,当然java8的效率要更好一些,主要是java8的HashMap在java7的基础上增加了红黑树这种数据结构,使得在桶里面查找数据的

热心网友 时间:2023-01-28 08:23

1.Map概述 我们都知道HashMap是线程不安全的,但是HashMap的使用频率在所有map中确实属于比较高的。因为它可以满足我们大多数的场景了。 Map类继承图 复制代码 Map是一个接口,我们常用的实现类...
2.HashMap的实现 java7和java8在实现HashMap上有所区别,当然java8的效率要更好一些,主要是java8的HashMap在java7的基础上增加了红黑树这种数据结构,使得在桶里面查找数据的.

热心网友 时间:2023-01-28 12:27

1、HashMap线程不安全原因: 原因: JDK1.7 中,由于多线程对HashMap进行扩容,调用了HashMap#transfer (),具体原因:某个线程执行过程中,被挂起,其他线程已经完成数据迁移,等CPU资源释放后被挂起的线程重新执行之前的逻辑,数据已经被改变,造成死循环、数据丢失。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
重本和一本一样吗 永劫无间是第几人称:小说叙事视角分析 名字未定(第三人称双男主 周霖 温宿) 我得了职业病〈轻度苯中毒〉,有职业病诊断证明书.工伤认定期间我没上... ...后来感觉麻烦,就直接去药店买药,他开了很多 这是十年前的功放,求高手看看那几个孔是什么? 车子断保险之后再交是一样的吗 车险断交后再续交 女性查激素六项什么时候检查 有一个素质很低下的室友是一种什么样的体验? 新鲜笋子煮麻辣鱼怎么做 笋子煮麻辣鱼的做法 hashmap数据结构及实现原理,其链表是用来解决什么问题的 hashmap是以什么方式存储数据 arraylist又是以什么方式存储数据 主题圣诞节幼儿园大班播报新闻 问题:瘦人一定内脏脂肪指数低吗?为什么? 内脏脂肪指数11.38是不是太高了? 女孩子内脏脂肪指数5,体重1米6,118斤,正常吗? 手机号影响人的运势么? 身体脂肪率:5.4%,体重指数:18.7,内脏脂肪指数:3,请问偏瘦吗? 正版win7家庭普通版32位的环境变量path值的默认值 内脏脂肪指数越低越好吗 win7旗舰版64位系统的环境变量中的Path值是多少? 联想win7家庭普通版中环境变量中的path值是什么,我不小心删了 乐府诗是源于什么朝代?最早那类诗名字是什么? 我国第一部长篇叙事诗《孔雀东南飞》的又名是什么? 汉乐府最有名的两首 日产逍客仪表盘油耗l/km是什么意思? 日产逍客仪表一行数字什么意思 尼桑逍客跑了一万多公里为什么变成2000多后面还有一个A? 日产-逍客 - 行程A和行程B是什么意思? 东风日产逍客里程表怎么扒 绿豆红豆汤怎么做好吃 红豆绿豆红枣粥的做法 信用证第47A项表示请帮忙解释一下 信用证47A相关条款翻译 信用证里的47A 信用证中的47A是什么意思 信用证高手,请问47A的这个条款是什么意思? 在学校教育中你遇到了什么难以解决的教育问题? 信用证43T: SEE FIELD47A是什么意思? 教师在教学中存在的问题 信用证46A、47A条款翻译 信用证47A中的条款 信用证的47A条款内容看不懂 关于信用证47A条款的问题,谁知道这是什么意思么? 关于信用证问题47A条款下的,帮忙翻一下什么意思谢谢啦 信用证条款47A 当前基础教育中存在的问题,该如何应对? 信用证47A T&#47;T reimbursement:prohibited 的意思是:不接受T&#47;T付还吧 信用证47A,求翻译 信用证47A,好多内容根本看不懂,请各位大侠帮忙翻译翻译!