HashMap多线程不安全问题总结

作者&投稿:调具 (若有异议请与网页底部的电邮联系)
~     1、HashMap的底层数据结构是数组+链表的结构。在插入数据的时候,会先计算数据的hashcode值,再取余放入数组对应下标处。如果发生hash碰撞,则插入当前node的后面,形成一个链表的结构。

2、数组的默认大小是16,默认的扩容因子是0.75,每次达到阈值( size * 0.75)的时候,就会对数组进行扩容,扩容每次都是在现有基础上扩容2倍。

3、在数组长度大于64,并且链表长度大于8的时候,链表会转成红黑树,之所以是需要数组长度大于64,是因为优先要扩容数组大小,减少hash碰撞的次数,提高性能。在红黑树小于7的时候,会转成链表,之所以是要小于7,是避免红黑树和链表之间的频繁转换。

了解到了HashMap的主要特点,再来看HashMap的线程不安全问题:

         在线程A、B put的数据发生hash碰撞并且数组里面已经有数据的情况下,两个线程同时获得头结点的next指针,next指针只能指向一条数据,比如有另外一条数据丢失。

        在数组扩容的时候,会new一个新的数组出来,再遍历旧的数组,如果从旧数组里面取出来的值非null,会将这个值取出来放到新数组里面,并将旧数组里面的值置为null,而这个时候,旧数组还没有遍历完全,另外一个线程get数据的时候可能获取到的时候就是null。


java中ConcurrentHashMap是线程安全的,我这样写有什么问题吗?_百度...
这样使用是有问题的。ConcurrentMap能够保证每一次调用(例如一次putIfAbsent)都是原子操作,不受多线程影响,但并不保证多次调用之间也是原子操作。以上实现的GetKeyBM方法中,ConcurrentMap的方法被调用了许多次,不同线程之间必然存在着竞争关系,导致最终结果不正确。现在的目标是,将下面描述的这一系列操作...

Map,Dictionary,Hash Table 有哪些异同
而HashMap(since JDK1.2)继承的则是AbstractMap这个抽象类。第二个区别我们从同步和并发性上来说说它们两个的不同。可以通过这两个类得源码来分析,Hashtable中的主要方法都做了同步处理,而HashMap则没有。可以说Hashtable在默认情况支持同步,而HashMap在默认情况下是不支持的。我们在多线程并发的...

java学习中的重点有哪些?
首要去找一个java的根底教程学一下,或许你也能够去找相应的视频。学习java根底的时分,应该尽量多着手,许多时分,你想当然的作业,等你写出来作业一下,你就会发现不是这么回事儿,不信你就试试。学完以上内容往后,你应该对java有一个根本的了解了,你能够用java言语写出一些简略的程序,并且你用的...

字节跳动面试难吗,应该如何应对?
字节跳动面试相对比较难。面试的问题,其实还是看基础掌握的是否牢固,计算机网络和算法与数据结构数据库尤为重要,操作系统也是重中之重。1、应届生应将面试的岗位需要基础扎实,而且要有一定的项目经验。社招会根据工作年限和应聘的岗位询问相应的问题注重的是框架原理,如果能力不扎实很难答出问题。2、 ...

StringBuilder sb=new StringBuilder(str);
StringBuilder sb=new StringBuilder(str)StringBuilder 类中 ,调用构造方法创建叫 sb 的对象 赋值为str sb.reverse();调用一个方法reverse,可以将字符串的内容反转 例:123变成321 String newstr = sb.tostring。使用一个String类型 叫 newstr的变量接收 sb.tostring的结果 tostring是一个将...

假期Java自学教程
4、集合 (1 Collection、2 泛型、3 List、4 Set、5 Collections、6 Map、7 HashMap 5、异常 (1 异常体系、2 异常分类、3 声明抛出捕获异常、4 自定义异常) 6、多线程 (1 线程概念、2 线程同步、3 Lock、4 线程生命周期、5 线程池) 7、Lambda表达式 (1 函数式思想概述、2 Lambda标准格式3 Lambda语法...

为什么有的企业要求多轮面试?
比如程序员的面试,第一轮面试会问一些基础知识,比如ArrayList和HashMap的区别是什么?HashMap如何解决hash冲突?有几大类hash冲突的解决方式?再比如,红黑树的特点?TreeSet说一下?应用场景?比如你了解的LaJi回收算法都有哪些?引用计数和可达性分析区别?等等。而对于第二轮面试和终面,多半都是高...

实战Java高并发程序设计读后感10篇_读后感_名著读后感
第4章 线程安全性 第5章 安全发布对象 第6章 线程安全策略 第7章 J.U.C之AQS 第8章 J.U.C组件拓展 第9章 线程调度-线程池 第10章 多线程并发拓展 第11章 高并发之扩容思路 第12章 高并发之缓存思路 第13章 高并发之消息队列思路 第14章 高并发之应用拆分思路 第15章 高并发之应用限流...

谁有比较全面的的Java面试题?
HashMap 把Hashtable 的contains 方法去掉了,改成containsvalue 和containsKey。因为contains方法容易让人引起误解。Hashtable 继承自Dictionary 类,而HashMap 是Java1.2 引进的Map interface 的一个实现。最大的不同是,Hashtable 的方法是Synchronize 的,而HashMap 不是,在多个线程访问Hashtable,不需要自己为它的方法...

JAVA前端开发的学习路线是怎样的?
127. 多线程网络爬虫 128. 反爬及反反爬策略 129. 通用爬虫设计 130. Echart 图表分析 131. IKAnalyzer 分词 132. 企业框架项目实战-代理商管理系统 133. 企业框架项目实战-SL 会员商城 134. 企业框架项目实战-会员管理系统 135.企业框架项目实战-互联网招聘信息采集分析平台 第四阶段: 前后端分离开发 136. Gi...

江川县17061472087: hashmap为什么线程不安全 -
微炕冠心: HashMap底层是一个Entry数组,当发生hash冲突的时候,hashmap是采用链表的方式来解决的,在对应的数组位置存放链表的头结点.对链表而言,新加入的节点会从头结点加入.javadoc中关于hashmap的一段描述如下:此实现不是同步的....

江川县17061472087: hashmap 为什么线程不安全 -
微炕冠心: 一直以来只是知道HashMap是线程不安全的,但是到底HashMap为什么线程不安全,多线程并发的时候在什么情况下可能出现问题?HashMap底层是一个Entry数组,当发生hash冲突的时候,hashmap是采用链表的方式来解决的,在对应的数组...

江川县17061472087: 如何线程安全的使用HashMap -
微炕冠心: 在周二面试时,一面的面试官有问到HashMap是否是线程安全的,如何在线程安全的前提下使用HashMap,其实也就是HashMap,Hashtable,ConcurrentHashMap和synchronized Map的原理和区别.当时有些紧张只是简单说了下HashMap不是线...

江川县17061472087: java hashset为什么线程不安全 -
微炕冠心: 安全和效率的zd问题 table虽然线程安全, 但是效率底 我们很多时候不会考虑到多线程的问题, 所以正确的做法就是如果需要专属, 使用效率高的hashmap而同时自己去同步, 而不是为了少写点编码, 而不管需要不需要同步都去使用效率低的hashtable

江川县17061472087: javaAPI文档中写hashmap“此实现不是同步的”线程不安全而hashtable“此实现是同步的”线程安全
微炕冠心: 意思是hashmap在多个线程同时操作时,结果会不可预料.而hashtable不会出现这个问题.具体原理你可以多了解一下多线程的东西.

江川县17061472087: 如何实现线程安全的hashmap -
微炕冠心: 方法一:通过Collections.synchronizedMap()返回一个新的Map,这个新的map就是线程安全的. 这个要求大家习惯基于接口编程,因为返回的并不是HashMap,而是一个Map的实现.

江川县17061472087: hashmap是线程安全还是不安全的 -
微炕冠心: String, Interger这样的wrapper类作为HashMap的键是再适合不过了,而且String最为常用.因为String是不可变的,也是final的,而且已经重写了equals()和hashCode()方法了.其他的wrapper类也有这个特点.不可变性是必要的,因为为了...

江川县17061472087: c#hashset线程安全吗 -
微炕冠心: 前同事问我个问题如何去证明HashSet是否是线程安全的,最近在系统的学习多线程,所以重新想起了这个问题,也写了个demo来证明HashSet不是线程安全的.什么是线程安全,就是对于数据的读写要线程隔离,不能导致数据的丢失和不一致...

江川县17061472087: 如何解决java中线程安全问题 -
微炕冠心: java中,线程安全的解决方法或过程: 1.如果对象是immutable,则是线程安全的,例如:String,可以放心使用. 2. 如果对象是线程安全的,则放心使用. 3.有条件线程安全,对于Vector和Hashtable一般情况下是线程安全的,但是对于某些特殊情况,需要通过额外的synchronized保证线程安全. 4.使用synchronized关键字.

江川县17061472087: Vector, ArrayList, HashMap 和Hashtable 哪个线程安全?为什么?
微炕冠心: 如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码.如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的. 比如一个 ArrayList 类,在添加一个元素...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网