HashMap的线程不安全主要体现在下面两个方面:

在JDK1.7中,当并发执行扩容操作时会造成环形链和数据丢失的情况。

在JDK1.8中,在并发执行put操作时会发生数据覆盖的情况。

?

?

常被问到的HashMap和Hashtable的区别

1、线程安全

两者最主要的区别在于Hashtable是线程安全,而HashMap则非线程安全。

Hashtable的实现方法里面都添加了synchronized关键字来确保线程同步,因此相对而言HashMap性能会高一些,我们平时使用时若无特殊需求建议使用HashMap,在多线程环境下若使用HashMap需要使用Collections.synchronizedMap()方法来获取一个线程安全的集合。

Note:Collections.synchronizedMap()实现原理是Collections定义了一个SynchronizedMap的内部类,这个类实现了Map接口,在调用方法时使用synchronized来保证线程同步,当然了实际上操作的还是我们传入的HashMap实例,简单的说就是Collections.synchronizedMap()方法帮我们在操作HashMap时自动添加了synchronized来实现线程同步,类似的其它Collections.synchronizedXX方法也是类似原理。

2、针对null的不同

HashMap可以使用null作为key,而Hashtable则不允许null作为key

虽说HashMap支持null值作为key,不过建议还是尽量避免这样使用,因为一旦不小心使用了,若因此引发一些问题,排查起来很是费事。

Note:HashMap以null作为key时,总是存储在table数组的第一个节点上。

3、继承结构

HashMap是对Map接口的实现,HashTable实现了Map接口和Dictionary抽象类。

4、初始容量与扩容

HashMap的初始容量为16,Hashtable初始容量为11,两者的填充因子默认都是0.75。

HashMap扩容时是当前容量翻倍即:capacity2,Hashtable扩容时是容量翻倍+1即:capacity2+1。

5、两者计算hash的方法不同

Hashtable计算hash是直接使用key的hashcode对table数组的长度直接进行取模

int hash = key.hashCode();

int index = (hash & 0x7FFFFFFF) % tab.length;

?

?

怎么解决这个线程不安全的问题

Java中有HashTable、Collections.synchronizedMap、以及ConcurrentHashMap可以实现线程安全的Map。

HashTable是直接在操作方法上加synchronized关键字,锁住整个数组,粒度比较大,

Collections.synchronizedMap是使用Collections集合工具的内部类,通过传入Map封装出一个SynchronizedMap对象,内部定义了一个对象锁,方法内通过对象锁实现

ConcurrentHashMap使用分段锁,降低了锁粒度,让并发度大大提高。

?

?

资料

原文:https://www.cnblogs.com/islch/p/12821753.html

hashmap扩容线程安全问题_HashMap在1.7 1.8中的线程安全问题相关推荐

  1. controller如何保证当前只有一个线程执行_今天我们来聊一聊 Spring 中的线程安全性...

    优质文章,及时送达 Spring与线程安全 Spring作为一个IOC/DI容器,帮助我们管理了许许多多的"bean".但其实,Spring并没有保证这些对象的线程安全,需要由开发 ...

  2. 多线程线程池的实现java_如何在Java中实现线程池

    多线程线程池的实现java 线程是独立程序的执行路径. 在java中,每个线程都扩展java.lang.Thread类或实现java.lang.Runnable. 多线程是指在一个任务中同时执行两个或 ...

  3. python线程安全的计数器_+ =运算符在Python中是线程安全的吗?

    + =运算符在Python中是线程安全的吗? 我想为实验创建一个非线程安全的代码块,这些是2个线程将要调用的函数. c = 0 def increment(): c += 1 def decremen ...

  4. C/C++线程与多线程工作笔记0004---认识C中的线程和多线程

    技术交流QQ群[JAVA,C++,Python,.NET,BigData,AI]:170933152 新建个工程:

  5. 聊一聊不同技术栈中hashmap扩容机制

    前言 hash简介 作为后端开发,说HashMap是我们最经常接触到的数据结构都不为过,而HashMap如其名最主要依赖的算法就是hash散列算法来存储和读取数据.         以关键码值K为自变 ...

  6. 黑马程序员--线程之间的通信,等待与唤醒机制,线程的终止方式,线程中的其他方法,优先级,toString() 守护线程,GUI图形化界面

    ------<a href="http://www.itheima.com" target="blank">Java培训.Android培训.iOS ...

  7. windows系统中创建线程常用哪几个函数,有什么区别?

    windows系统中创建线程常用哪几个函数? 在windows系统中创建线程的函数有: CreadThread,AfxBeginThread,_beginthread,_beginthreadex. ...

  8. pthread线程传递数据回主线程_操作系统4:线程(1)

    接下来讨论下线程.进程和线程是一个很有趣的话题,进程和线程的区别到底是什么?一些书上讲线程是"轻量级进程",从而可以节省切换开销.但是线程到底是怎么样成为轻量级进程的呢? 可以设想 ...

  9. 深入理解java中的线程池

    线程池中各个参数的含义 corePoolSize: 核心池的大小,这个参数跟线程池的实现原理有非常大的关系.**在创建了线程池后,默认情况下,线程池中并没有任何线程,而是等待有任务到来才创建线程去执行 ...

最新文章

  1. VS中快速生成dll和lib方法
  2. SQL Server 的分散式資料複寫技術
  3. 激活用户并让他留下,仅是“活下去”的第一步
  4. Secondary NameNode:它究竟有什么作用?(转自:http://blog.csdn.net/xh16319/article/details/31375197)
  5. Linux编程基础——GDB(查看数据)
  6. java导入excel 实例_Java数据导入功能之读取Excel文件实例
  7. 从数据仓库系统对比看Hive发展前景
  8. C语言学习笔记-1(资料:郝斌老师C语言视频)
  9. 利用Java编写自动关机程序(包括输入、输出、控制电脑自动关机)
  10. windows PE结构解析
  11. 过山车css动画,three.js 124版本实现彩虹过山车动画
  12. 无人机飞行模式(Ardupilot和MAVLink协议)(STABILIZE、ALTITUDE HOLD、LOITER、GUIDE、AUTO、LAND、RTL)
  13. 百度、阿里、腾讯、华为和移动等常用网盘免费空间与性价比
  14. 2021-08-06
  15. 进入邻居家的无线路由器
  16. android sip协议栈,基于Android平台及SIP协议的软电话系统的研究
  17. magento怎么修改货币符号,在之前加上国家缩写
  18. PyQt5:ToggleButton开关按钮(24)
  19. xp计算机远程桌面设置密码,远程桌面连接设置,详细教您xp怎么设置远程桌面连接...
  20. 搭建量化交易系统接口的步骤是什么?

热门文章

  1. 如何把图片存入到数据库
  2. 怎样设置 vmware 开放一个网络端口,使网络上的电脑能访问这个端口
  3. 【IDEA】向IntelliJ IDEA创建的项目导入Jar包的两种方式
  4. 宁德时代拟再投240亿元扩产宜宾基地
  5. 爱回收回应下架通报:认真整改 切实落实用户隐私信息保护
  6. 支持5G的iPhone SE Plus或将于明年面世
  7. 产业链人士:台积电将同设备及原材料供应商谈判,希望明年降价15%
  8. 特斯拉:在行驶20万英里后 其电动汽车电池仍有90%容量
  9. 最后一届90后毕业了 超485万人在抖音发布毕业视频
  10. 迪迦奥特曼“亲临”发布会!一加9R今日发布:价格成唯一悬念