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. java课堂疑问解答与思考1
  2. pycharm 修改新建文件时的头部模板
  3. 【深度学习】当YOLOv5遇见OpenVINO!
  4. 21.Odoo产品分析 (三) – 人力资源板块(2) – 工时表(1)
  5. 您的第一个简单的机器学习项目
  6. 【Java】Java多线程神器:join使用及原理
  7. lombok的相关注解使用
  8. Exchange 2007r2 二,动手安装
  9. python __main__ __name__ __file__
  10. 分号可以用来分段么_阳台竟然可以这样装,别再忽视它了
  11. 简单的树遍历枚举器v0.2-挑战一个程序员到底能多懒- 添加广度优先遍历
  12. 无需开机QQ宠物永久在线刷等级
  13. httpclient下载图片或者其他文件
  14. 行业分析常用到的21个网站
  15. windows下cfree5中%d输出浮点数的问题
  16. showtext matlab,使用MATLAB 2019 App Design 工具设计一个 电子日记App
  17. Excel之用Sumifs完成多条件多列的求和
  18. 智慧工地给工地装上“最强大脑”
  19. 生信软件(1)bioawk
  20. Oracle DBA日常工作手册

热门文章

  1. 空间站是如何绕地飞行的?张朝阳物理课开播啦
  2. 英雄联盟S11总决赛EDG夺冠,网友:立下的flag可以兑现了
  3. 暴跌1300亿,机械茅也扛不住了
  4. 唯品会回应“不正当竞争行为”:接受处罚 进行全面整改
  5. AMD官宣350亿美元收购赛灵思 赛灵思大涨8.56%
  6. 苹果WWDC 2020回顾:来看看这个安卓味的iOS 14!
  7. 搜狗520甜蜜告白攻势:爱的心动 让她看见
  8. 屏幕持续升级!一加8斩获DisplayMate A+评级
  9. 全面提升AR感知能力的新款iPad Pro或将延期发布
  10. 苹果2020年全系展望:iPhone12不会去掉刘海但5G是必须的