hashmap扩容线程安全问题_HashMap在1.7 1.8中的线程安全问题
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中的线程安全问题相关推荐
- controller如何保证当前只有一个线程执行_今天我们来聊一聊 Spring 中的线程安全性...
优质文章,及时送达 Spring与线程安全 Spring作为一个IOC/DI容器,帮助我们管理了许许多多的"bean".但其实,Spring并没有保证这些对象的线程安全,需要由开发 ...
- 多线程线程池的实现java_如何在Java中实现线程池
多线程线程池的实现java 线程是独立程序的执行路径. 在java中,每个线程都扩展java.lang.Thread类或实现java.lang.Runnable. 多线程是指在一个任务中同时执行两个或 ...
- python线程安全的计数器_+ =运算符在Python中是线程安全的吗?
+ =运算符在Python中是线程安全的吗? 我想为实验创建一个非线程安全的代码块,这些是2个线程将要调用的函数. c = 0 def increment(): c += 1 def decremen ...
- C/C++线程与多线程工作笔记0004---认识C中的线程和多线程
技术交流QQ群[JAVA,C++,Python,.NET,BigData,AI]:170933152 新建个工程:
- 聊一聊不同技术栈中hashmap扩容机制
前言 hash简介 作为后端开发,说HashMap是我们最经常接触到的数据结构都不为过,而HashMap如其名最主要依赖的算法就是hash散列算法来存储和读取数据. 以关键码值K为自变 ...
- 黑马程序员--线程之间的通信,等待与唤醒机制,线程的终止方式,线程中的其他方法,优先级,toString() 守护线程,GUI图形化界面
------<a href="http://www.itheima.com" target="blank">Java培训.Android培训.iOS ...
- windows系统中创建线程常用哪几个函数,有什么区别?
windows系统中创建线程常用哪几个函数? 在windows系统中创建线程的函数有: CreadThread,AfxBeginThread,_beginthread,_beginthreadex. ...
- pthread线程传递数据回主线程_操作系统4:线程(1)
接下来讨论下线程.进程和线程是一个很有趣的话题,进程和线程的区别到底是什么?一些书上讲线程是"轻量级进程",从而可以节省切换开销.但是线程到底是怎么样成为轻量级进程的呢? 可以设想 ...
- 深入理解java中的线程池
线程池中各个参数的含义 corePoolSize: 核心池的大小,这个参数跟线程池的实现原理有非常大的关系.**在创建了线程池后,默认情况下,线程池中并没有任何线程,而是等待有任务到来才创建线程去执行 ...
最新文章
- java课堂疑问解答与思考1
- pycharm 修改新建文件时的头部模板
- 【深度学习】当YOLOv5遇见OpenVINO!
- 21.Odoo产品分析 (三) – 人力资源板块(2) – 工时表(1)
- 您的第一个简单的机器学习项目
- 【Java】Java多线程神器:join使用及原理
- lombok的相关注解使用
- Exchange 2007r2 二,动手安装
- python __main__ __name__ __file__
- 分号可以用来分段么_阳台竟然可以这样装,别再忽视它了
- 简单的树遍历枚举器v0.2-挑战一个程序员到底能多懒- 添加广度优先遍历
- 无需开机QQ宠物永久在线刷等级
- httpclient下载图片或者其他文件
- 行业分析常用到的21个网站
- windows下cfree5中%d输出浮点数的问题
- showtext matlab,使用MATLAB 2019 App Design 工具设计一个 电子日记App
- Excel之用Sumifs完成多条件多列的求和
- 智慧工地给工地装上“最强大脑”
- 生信软件(1)bioawk
- Oracle DBA日常工作手册
热门文章
- 空间站是如何绕地飞行的?张朝阳物理课开播啦
- 英雄联盟S11总决赛EDG夺冠,网友:立下的flag可以兑现了
- 暴跌1300亿,机械茅也扛不住了
- 唯品会回应“不正当竞争行为”:接受处罚 进行全面整改
- AMD官宣350亿美元收购赛灵思 赛灵思大涨8.56%
- 苹果WWDC 2020回顾:来看看这个安卓味的iOS 14!
- 搜狗520甜蜜告白攻势:爱的心动 让她看见
- 屏幕持续升级!一加8斩获DisplayMate A+评级
- 全面提升AR感知能力的新款iPad Pro或将延期发布
- 苹果2020年全系展望:iPhone12不会去掉刘海但5G是必须的