hashmap是线程安全的吗

不安全。

翻到今年前写的笔记,不过当时估计看的是1.6版本的,有一些内容如果已经发生变化,请留言指正。(加粗的部分都是知识点)

非线程安全

并发场景中如果不保持足够的同步,可能会在执行HashMap.get时进入死循环。

高并发场景中,使用ConcurrentHashMap;采用数组方式存储key.value构成的Entry对象,无容量限制;基于key hash寻找Entry对象存储到数组中的位置,对于hash冲突采用链表方式解决;插入元素时可能要扩大数组的容量,需要重新计算hash,并复制新对象到数组中。

HashMap

  • 创建:HashMap():

默认是创建loadFactor = 0.75 ,threshold = 12 ,大小为16的Entry对象数组。

  • 增加:put(Object key , Object value)

key = null ,遍历,找到则将新的value赋值;如果没有找到则增减一个Entry对象,key为null,value为传入对象,next指向当前数组的第一个对象;

如果当前数组使用大小 >= threshold,则将数组扩大为当前大小的两倍,扩大时对当前Entry对象数组中的元素重新hash,并填充数组,重新设置threshold值。

  • 获取单个对象:get(Object key)

!=null时,对key进行按位与操作,找到对应的存储位置,找到此位置对应的Entry对象,基于next属性遍历,需要到hash值相等,且key值相等并或equals的Entry对象,返回其value,未找到返回null。

  • 删除:remove( Object key)

与get类似

  • 判断对象是否存在:containsKey( Object key )

调用getEntry方法完成,过程与get过程基本相同。

  • 遍历:keySet()

遍历时,无法保证顺序


希望我的解答能够帮助到你!

hashMap是否线程安全基本上是在每次面试都会问的了,而99%的JAVA程序员都知道hashMap是非线程安全的,不过知道其底层原因的应该不多,下面来说下为什么是线程不安全的!

我们都知道,hashMap是一种在开发中最常用的数据结构(key-value型),因为它很快(O(1)常数级别的查询),在存储的时候通过计算key的hash值,将value存在对应的桶里(数组的一个元素),然后通过头插法插入桶中的单向链表里,如下图所示:

这个过程是线程安全的,因为就算是发生了线程同享资源,无非就是插入的数据顺序问题而已,无伤大雅,但是我们都知道,hashMap为了防止数据查询过慢(如果单链表中的数据过大,相当于O(1)常数级别的性能下降为O(N)线性级别),采取了自动扩容的方式,一旦存储数据的大小size超过了总容量的0.75(装载因子),就发生自动扩容,安全问题也就随之诞生了!

hashMap怎么实现扩容呢?一旦需要扩容的时候,会新建一个两倍容量的hashMap,并把原来的元素重新做hash存入新的hash数组,底层源码使用的resize方法:

在resize方法中需要调用transfer方法,方法很简单,无非就是遍历老hash数组,然后重新放入新的hash数组中,如下:

当thread1执行到Entry<k,v> next =e.next的时候,把原来的key7指向key3,变为了key3指向key7,因为java是抢占式线程,此时thread2开始执行,不过在线程2中的快照中,还是key7指向key3(但实质key3已经指向了key7)!

经过线程2的处理完成,线程继续处理,这个时候key3指向key7,反过来key7也指向key3,这时候单链表变成了环形链表:

等到查询方法查找到这个hash数组的时候,查询出现了死循环,永远卡死在这,CPU跑满。

所以hashMap是非线程安全的,相对应的hashTable拥有着和hashMap类似的结构,但是因为hashTable中的所有方法都加了锁(synchonize),所以在多线程处理中,应该是用hashTable来换取数据的安全性!

原创文章,作者:普尔小编,如若转载,请注明出处:http://www.puerpx.cn/pxwd/8447.html

(0)
上一篇 2023-03-12 下午1:24
下一篇 2023-03-12 下午2:05

相关推荐

  • 家庭主妇的婚姻何去何从(荒唐婚姻何去何从)

    婚姻是迷醉、眩晕的爱情的剧终,婚姻开启的是爱情的另一种模式。 这种模式一般不会在艺术作品中出现,所以,在小说电影连续剧里边没有答案。 《射雕英雄传》里小魔女黄蓉和憨哥哥郭靖的爱情冒…

    培训问答 2023-01-11
  • 如何像学母语一样学外

    我们祖先,千方百计的把东夷九黎古语演变,现在大家学英语,又想把东夷九黎古语返璞归真可是?这样不是活摆使人吗?语言研究的规律,我知道的一清二楚。正因为东夷九黎上古语言难学难懂,还不断…

    培训问答 2023-01-14
  • 演讲培训,那些演讲培训有用吗

    咱们来看一位高校教务老师的演讲学习之旅 “我是北京某知名高校的一名教务老师!我认为,演讲是天赋,三天时间不可能做到张嘴就来!” ——题记 2018年4月4号 北京 大雪 家 本该是…

    培训问答 2022-04-19
  • 学习unity好找工作吗

    unity游戏开发好找工作吗?现在的游戏公司和企业很多,一直都缺人,所以找工作并不难找,但是否是你喜欢的就另当别论了。我们把游戏公司分为三种。 下面可以简单看看校招的招聘需求: A…

    培训问答 2023-02-11
  • 中职技校,职高和技校有什么分别

    ! 中专和技校差别不大,没有好坏之分。 中专的全称一般是中等专业学校,和职业高中一个层次;技校的全称是某某技术学校或某某技术学院,有中专层次,有高职高专层次(大专)。两类学校都是在…

    培训问答 2022-06-12
  • 消防证报考条件,消防工程师证需要什么条件可以考

    报名条件:凡中华人民共和国公民,遵守国家法律、法规,恪守职业道德,并符合注册消防工程师资格考试报名条件之一的,均可申请参加相应级别注册消防工程师资格考试。 一级注册消防工程师资格考…

    培训问答 2022-10-23
  • 千里香馄饨馅怎么调

     千里香馄饨配料:  精肉1000克,糯米粉40克,复合磷酸盐5克,鸡肉精油2克,猪肉香精1克,盐20克,鸡粉10克。   做法: 1、选料:选用猪后腿精肉,要力求新鲜。  2、剔…

    培训问答 2022-12-23
  • 开发网站需要学什么

    网站开发不是单一的技术体系可以完成的,它是多门技术综合使用来完成的,你需要梳理出一条技术主线再进行学习,这样效果才能很好! 在这里罗列一些基本常用到的技术知识点提供参考: 网页知识…

    培训问答 2022-11-28
  • 如何学习美术,如何学习美术史

    如何学习美术,最重要是根据不同目的,肯定有不同方式方法。 首先说能够想到要学习美术,就是很值得点赞的想法,现代社会的人,如果没有一项艺术在手,真的挺尴尬的,就是平常说的才艺,而美术…

    培训问答 2023-05-13
  • 高中补习班到底有那么重要吗

    高中就是奔着上大学而去,高中补习班就是最后一里地,学好了那就是直奔名牌大学,你说重要不重要? 大学也分上中下,清华北大等就是最高学府,进去了就等于孙悟空上天庭,天王老子也另眼相看。…

    培训问答 2022-05-17