当前位置: 首页 > backend >正文

JAVA:多线程使用哈希表

HashMap

线程安全性

线程不安全,无任何同步机制。多线程在读写情况下可能出现数据不一致的情况 

底层结构

JDK 1.7及之前用的是数组加链表

JDK1.8 优化成了数组加链表加红黑树

当链表长度超过阈值就会转换成红黑树,提升查找效率。 

null支持

允许键和值都为null, 但是键只能有一个为null,注意HashMap的键具有唯一性;因为null的哈希值计算特殊,通常存储在数组的第一个位置附近。

性能

 单线程或者线程安全时,读写性能优秀。哈希算法可进行快速定位,链表或者红黑树处理冲突,平均的时间复杂度接近O(1)

HashTable

线程安全性

是线程安全的,通过给方法添加 synchronized 锁实现,因为给方法加锁的缘故,每个方法在同一时间只允许一个线程执行,虽然保证了数据的安全性,但在多线程的情况下性能较差。 

底层结构

 数据结构采用数组加链表的形式,通过哈希算法确定元素的位置,哈希冲突时用链表解决。

null支持

不允许键或值为null ,如果尝试插入null 会直接抛异常。HashTable 内部代码对 null 做了严格的检查。 

性能

多线程环境下,线程竞争锁激烈,读写性能低下;若单线程使用还有锁的开销不如直接用HashMap,基本已经被淘汰 

ConcurrentHashMap

线程安全性

是线程安全的,采用优化的锁策略, 跟HashTable 不同的是锁粒度更细,并发性能更高。

底层结构

JDK 1.7 也是数组加链表的形式,将数组元素分组去加锁;在JDK1.8 采用数组加链表加红黑树的形式,对每个数组元素加锁。通过CAS与锁保证多线程下的数据一致性。

null支持

不允许键或值为null,在多线程中,null可能会导致歧义,例如无法区分是初始化的null 还是插入的null。 

性能

 多线程并发读写性能优越,读操作几乎无锁,写操作锁粒度更细,减少了线程竞争,在高并发场景性能接近HashMap。

总结

名称HashMapHashTableConcurrentHashMap
线程安全性非线程安全线程安全线程安全
底层结构

JDK1.7数组+链表

JDK1.8数组+链表+红黑树

数组+链表

JDK1.7数组+链表

JDK1.8数组+链表+红黑树

null支持允许键值为null不允许键值为null不允许键值为null
性能单线程性能优,多线程不安全多线程性能差多线程性能优

http://www.xdnf.cn/news/6526.html

相关文章:

  • Web前端入门:JavaScript 的应用领域
  • [数据结构]7. 堆-Heap
  • undefined reference to vtable for DeviceAllocator‘
  • 【补充笔记】修复“NameError: name ‘ZhNormalizer‘ is not defined”的直接方法
  • Python基础
  • 吴恩达机器学习笔记:特征与多项式回归
  • springboot AOP中,通过解析SpEL 表达式动态获取参数值
  • 第二十五天打卡
  • GUI图形化演示
  • 【测试】用例篇
  • 免疫浸润分析
  • 哲学物理:太极图和莫比乌斯环有什么关系?
  • 【QT 项目部署指南】使用 Inno Setup 打包 QT 程序为安装包(超详细图文教程)
  • Vue3的基础知识
  • 【skywalking】index“:“skywalking_metrics-all“},“status“:404}
  • Ansys Zemax | 在 MATLAB 或 Python 中使用 ZOS-API 进行光线追迹的批次处理
  • TASK02【Datawhale 组队学习】使用 LLM API 开发应用
  • javascript —— ! 和 !! 的区别与作用
  • 傻子学编程之——数据库如何性能优化
  • 西瓜书【机器学习(周志华)】目录
  • [网络升级指南] 服务器网卡/带宽如何选?1GbE vs 10GbE vs 25GbE+ 性能与成本深度解析 (2025)
  • 香山新篇:海淀低密奢居的典范之作
  • 今日行情明日机会——20250515
  • OpenShift AI - 用 ModelCar 构建容器化模型,提升模型弹性扩展速度
  • 冲刺软考:做减法,走出备考迷茫,高效提分!
  • 学习C++的好书:C++编程之禅
  • Spring类
  • 基于WinCC flexible 2008、STEP_7和博途之间的项目移植
  • rsync入门笔记
  • 【Redis】压缩列表