ConcurrentHashMap 和 Hashtable 的区别
2024-09-06 07:48:09
ConcurrentHashMap 和 Hashtable 的区别主要体现在实现线程安全的方式上不同。
1.底层的数据结构:
ConcurrentHashMap 在jdk1.7之前采用的是 分段的数组和链表 实现的,在jdk1.8之后采用的是和HashMap相同的结构 数组+链表/红黑二叉树。
此结构中,数组HashMap的主体,而链表是为了解决哈希冲突而存在的。
2.实现线程安全的方式:
(1)在JDK1.7的时候,ConcurrentHashMap(分段锁) 对整个桶数组进行了分割分段(Segment),每一把锁只锁容器其中一部分数据,多线程访问容器里不同数据段的数据,就不会存在锁竞争,提高并发访问率。
到了 JDK1.8 的时候已经摒弃了Segment的概念,而是直接用 Node 数组+链表+红黑树的数据结构来实现,并发控制使用 synchronized 和 CAS 来操作。(JDK1.6以后 对 synchronized锁做了很多优化) 整个看起来就像是优化过且线程安全的 HashMap,虽然在JDK1.8中还能看到 Segment 的数据结构,但是已经简化了属性,只是为了兼容旧版本;
(2)Hashtable(同一把锁) :使用 synchronized 来保证线程安全,效率非常低下。当一个线程访问同步方法时,其他线程也访问同步方法,可能会进入阻塞或轮询状态,如使用put 添加元素,另一个线程不能使用 put 添加元素,也不能使用 get,竞争会越来越激烈效率越低。
最新文章
- Shell 去掉文本中的空格
- 杭电1003-Max Sum
- 装逼利器之DLog -DEBUG
- 在IT网站上少花些时间
- bzoj1312
- spring-boot + Ehcache without XML
- Spring 事务模型
- HDU 5763 Another Meaning(FFT)
- android 在你的UI中显示Bitmap - 开发文档翻译
- hdu_1033(我怎么找到的这么水的题,只为保存代码。。。)
- 极限学习机︱R语言快速深度学习进行回归预测
- centos下 kerberos安装手册
- app 下载更新 file-downloader 文件下载库的简单介绍和使用
- Zabbix (四)用户管理
- js学习之路2: JavaScript 变量
- 分享张鑫旭大神的,纯css打字小技巧,我顺便收藏一下
- 网络基础知识 - HTTP协议
- HTTP Error 400. The request hostname is invalid
- [development][dpdk] dpdk-pmdinfo 工具的使用
- python:find()函数,字符串查询