JavaEE——多线程中的哈希表

目录

前言

在使用多线程前,我们用HashMap类来创建哈希表,但这个类线程不安全,在这篇文章,我们将介绍多线程环境的哈希表,将会讲述HashTable, HashMap, ConcurrentHashMap这三个类的主要区别。

1.HashTable

HashTable实际上就是线程安全的HashMap,两者的功能十分相似,只是HashTable会在代码一些关键地方进行加锁,比如看其中的get方法:

HashTable虽然是线程安全的类,但已经不推荐使用了,我们目前主流使用的就是接下来要提到的ConcurrentHashMap。

2.ConcurrentHashMap

ConcurrentHashMap是针对多线程场景专门优化的一个哈希表,使用方法和普通的哈希表一样。

java 复制代码
ConcurrentHashMap<Integer, String> map = new ConcurrentHashMap<>();

ConcurrentHashMap,对比于HashTable,最大的调整是针对锁的粒度进行了优化,上面可以看到,HashTale针对this进行加锁,如果进行操作,针对任何一个进程,都会对整个哈希表触发锁竞争。

而ConcurrentHashMap上,对哈希表上的每一个链表都提供了一个锁。也就是说,在针对哈希表中同一个链表的修改才会引入阻塞。这样的方案使竞争更小。

此外ConcurrentHashMap采取了原子类的放哪,基于CAS操作来针对size进行变更。

在ConcurrentHashMap扩容的时候,不会把所有键值对都搬运到更大的数组上,每次只运一部分,来确保单次搬运的速度足够快,使锁的持有时间足够短,减少开销。具体是每次进行get,put,remove等操作时,都会搬运一部分。

总结

本篇文章讲述了HashTable, HashMap, ConcurrentHashMap的主要区别,其中ConcurrentHashMap的区别最多,优化最好,需要着重进行理解。

相关推荐
我是人✓几秒前
Spring IOC注解全解析和Spring整合测试单元
java·后端·spring
智购科技无人售货机工厂店7 分钟前
玻璃瓶饮料破损率突然上升,排查发现是取货口缓冲垫老化了~YH
java·开发语言·人工智能·python·eclipse
镜象科技16 分钟前
中小学AI心理健康解决方案服务商怎么选?2026年选型参考
android·java·人工智能
阿狗童鞋23 分钟前
高并发系统设计实战指南
java·spring boot·spring cloud
Sam_Deep_Thinking27 分钟前
CountDownLatch实现原理
java·后端·面试·程序员
小狼Solar29 分钟前
SAP MDG 功能范围说明(基于S/4HANA 2025)
java·开发语言
范中勤30 分钟前
Python 与 Java:模块、包、对象、反射核心差异总结
java·python·面试·反射·元类
ab12376832 分钟前
Spring Integration 完整笔记 + 和 spring-integration-mqtt、Paho、EMQX 的关系
java·笔记·spring
小蜗牛狂飙记38 分钟前
java环境一键配置和切换的ui工具
java
逆光的July42 分钟前
可靠消息投递与消费的工程设计:Outbox、幂等、死信兜底
java