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: 核心池的大小,这个参数跟线程池的实现原理有非常大的关系.**在创建了线程池后,默认情况下,线程池中并没有任何线程,而是等待有任务到来才创建线程去执行 ...
最新文章
- VS中快速生成dll和lib方法
- SQL Server 的分散式資料複寫技術
- 激活用户并让他留下,仅是“活下去”的第一步
- Secondary NameNode:它究竟有什么作用?(转自:http://blog.csdn.net/xh16319/article/details/31375197)
- Linux编程基础——GDB(查看数据)
- java导入excel 实例_Java数据导入功能之读取Excel文件实例
- 从数据仓库系统对比看Hive发展前景
- C语言学习笔记-1(资料:郝斌老师C语言视频)
- 利用Java编写自动关机程序(包括输入、输出、控制电脑自动关机)
- windows PE结构解析
- 过山车css动画,three.js 124版本实现彩虹过山车动画
- 无人机飞行模式(Ardupilot和MAVLink协议)(STABILIZE、ALTITUDE HOLD、LOITER、GUIDE、AUTO、LAND、RTL)
- 百度、阿里、腾讯、华为和移动等常用网盘免费空间与性价比
- 2021-08-06
- 进入邻居家的无线路由器
- android sip协议栈,基于Android平台及SIP协议的软电话系统的研究
- magento怎么修改货币符号,在之前加上国家缩写
- PyQt5:ToggleButton开关按钮(24)
- xp计算机远程桌面设置密码,远程桌面连接设置,详细教您xp怎么设置远程桌面连接...
- 搭建量化交易系统接口的步骤是什么?
热门文章
- 如何把图片存入到数据库
- 怎样设置 vmware 开放一个网络端口,使网络上的电脑能访问这个端口
- 【IDEA】向IntelliJ IDEA创建的项目导入Jar包的两种方式
- 宁德时代拟再投240亿元扩产宜宾基地
- 爱回收回应下架通报:认真整改 切实落实用户隐私信息保护
- 支持5G的iPhone SE Plus或将于明年面世
- 产业链人士:台积电将同设备及原材料供应商谈判,希望明年降价15%
- 特斯拉:在行驶20万英里后 其电动汽车电池仍有90%容量
- 最后一届90后毕业了 超485万人在抖音发布毕业视频
- 迪迦奥特曼“亲临”发布会!一加9R今日发布:价格成唯一悬念