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,竞争会越来越激烈效率越低。

最新文章

  1. Shell 去掉文本中的空格
  2. 杭电1003-Max Sum
  3. 装逼利器之DLog -DEBUG
  4. 在IT网站上少花些时间
  5. bzoj1312
  6. spring-boot + Ehcache without XML
  7. Spring 事务模型
  8. HDU 5763 Another Meaning(FFT)
  9. android 在你的UI中显示Bitmap - 开发文档翻译
  10. hdu_1033(我怎么找到的这么水的题,只为保存代码。。。)
  11. 极限学习机︱R语言快速深度学习进行回归预测
  12. centos下 kerberos安装手册
  13. app 下载更新 file-downloader 文件下载库的简单介绍和使用
  14. Zabbix (四)用户管理
  15. js学习之路2: JavaScript 变量
  16. 分享张鑫旭大神的,纯css打字小技巧,我顺便收藏一下
  17. 网络基础知识 - HTTP协议
  18. HTTP Error 400. The request hostname is invalid
  19. [development][dpdk] dpdk-pmdinfo 工具的使用
  20. python:find()函数,字符串查询

热门文章

  1. Codeforces 1174C Ehab and a Special Coloring Problem
  2. kubernetes session and 容器root权限
  3. Python环境出现模块找不到
  4. 20140321 sizeof 虚函数与虚函数表 静态数组空间 动态数组空间 位字段
  5. 【python】并集交集
  6. 转载:ASP.NET Core 在 JSON 文件中配置依赖注入
  7. Mysql优化-概述
  8. Android开发 了解ViewModel
  9. VBS脚本完美实现开机延时启动
  10. thinkphp 跳转和重定向