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的区别最多,优化最好,需要着重进行理解。

相关推荐
吴声子夜歌32 分钟前
TypeScript——基础类型(三)
java·linux·typescript
DynamicsAgg2 小时前
企业数字化底座-k8s企业实践系列第二篇pod创建调度
java·容器·kubernetes
森林里的程序猿猿2 小时前
并发设计模式
java·开发语言·jvm
222you2 小时前
四个主要的函数式接口
java·开发语言
Javatutouhouduan3 小时前
Java全栈面试进阶宝典:内容全面,题目高频!
java·高并发·java面试·java面试题·后端开发·java程序员·java八股文
SEO-狼术3 小时前
RAD Studio 13.1 Florence adds
java
ywf12153 小时前
Spring Boot接收参数的19种方式
java·spring boot·后端
敲代码的瓦龙4 小时前
Java?面向对象三大特性!!!
java·开发语言