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

相关推荐

  • 南方医科大学怎么样

    一、学校介绍 南方医科大学前身为中国人民解放军第一军医大学,创建于1951年,1979年被确定为全国重点大学,2004年8月整体移交广东省,更名为南方医科大学。学校是全国首批、广东…

    培训问答 2023-04-26
  • 玩转昆明老街(昆明老街老巷怎么玩)

    我们给你介绍一下昆明老街的各条街道比较有特色的小店。喜欢泡茶吧、咖啡吧、酒吧的游客,可以首选钱王街。这条街道是以人名命名的。 同庆丰、马家大院、傅氏宅院这些古建筑也可以拍照留念,这…

    培训问答 2023-01-25
  • 广州市公用事业高级技工学校

    疫情期间的在校的感受! 是学习? 疫情防控 继续学习 步入新学期 站在新起点 严格服从学校规定 遵守制度 加强身体健康素质 注重提高学习效率 风雨过后春更暖 迎来繁华更烂漫 纸短情…

    培训问答 2022-11-17
  • 暑期该不该给孩子上暑期班

    答,该不该叫孩子暑期也练习舞蹈?提的好,是很多有在学习舞蹈孩子家长的疑问。我是一个舞蹈爰好者,凭我自己学习舞蹈的经历来讲,我认为,暑期也应该让孩子继续练舞蹈,这是肯定的回答。为什么…

    培训问答 2022-10-26
  • 英国中央兰开夏大学毕业回国就业

    中央兰开夏大学成立于1828年,英文全名University of Central Lancashire (UCLan),是一所英国百年公立大学。中央兰开夏大学坐落在不列颠西海岸红…

    培训问答 2023-07-01
  • 中央干部学院机构规格(党政干部培训)

    为了提高各级干部的理论素养和业务能力,我国开办了数量繁多的干部培训学校,其中,规格较高、隶属于中央管理的共有5所。 一、中央党校 中央党校加挂“国家行政学院”的牌子,是我国干部培训…

    培训问答 2022-06-05
  • 成考怎么考学位证(成考怎么考全日制研究生)

    成考基本常识 一、考试介绍 成人高考属国民教育系列,列入国家招生计划,国家承认学历,参加全国招生统一考试,各省、自治区统一组织录取。 成人高等学历教育分为三种:专科起点升本科(简称…

    培训问答 2023-01-10
  • 邢台教育水平怎么样

    邢台的教育水平怎么样?,我们从正反两面,不同维度分析一下: 成绩 初中高中的升学率一直不错 特色专业喜人 在邢台,中学生的升学率一直不错,每年教育局的数据很客观的能体现出来。每年考…

    培训问答 2023-06-01
  • 美术集训应该怎么选择

    选择校考集训画室选择非常重要!要根据自己的考学重点,考央清来北京,考国美去杭州,考鲁美去大连等等。集中训练肯定是以专业为主,现在的正规的画室都不会设文化课教学(教育部政策)! 美术…

    培训问答 2022-12-26
  • 如何学好数理化(如何学好数理化方法)

    在理科的学习中,概念的学习毫无疑问是重中之重。然而,这个重点又是一个难点。因为不少人抽象思维较差,对于干巴巴的概念怎么也学不好。使用速读记忆训练工具会有一定的提高。为此,在这里为大…

    培训问答 2023-04-18