Java中的ConcurrentHashMap的使用与原理
Java 多线程,系列文章:
《Java多线程》
《Java创建多线程的3种方法:继承Thread类、实现Runnable接口、实现Callable接口》
《Java多线程的同步:synchronized关键字、Lock接口、volatile关键字》
《Java线程池》
《Java线程池实现秒杀功能》
《SpringBoot使用ThreadLocal保存登录用户信息》
《Java中的ConcurrentHashMap的使用与原理》
1、线程安全的 Map 容器
以下是 JDK 中主要提供的线程安全 Map 容器及其特性对比(重点关注 JDK 8 及之后版本):
容器类型 | 核心机制 | 适用场景 |
---|---|---|
ConcurrentHashMap | 桶级锁(CAS + synchronized)、无锁读、红黑树优化。 | 高并发读写、大规模数据存储。 |
ConcurrentSkipListMap | 基于跳表(SkipList)实现,天然有序(按键排序)。 | 需要并发访问且按键排序的场景(如排行榜)。 |
Collections.synchronizedMap() | 包装普通 Map(如 HashMap),使用全局 synchronized 锁。高并发下性能差、读操作阻塞、复合操作需外部加锁。 | 极低并发或临时线程安全需求。 |
Hashtable | 遗留类,不推荐,全表级 synchronized 锁,性能最差。 | 与 SynchronizedMap 类似,但迭代器弱一致性。 |
关于 Java 中更多的集合类的详细介绍,请点击并浏览本博客的文章:《Java集合类》
2、ConcurrentHashMap 的使用
ConcurrentHashMap 是 Java 中为高并发场景设计的线程安全哈希表实现,位于 java.util.concurrent 包。它解决了 Hashtable 和 Collections.synchronizedMap() 的锁粒度过大导致的性能问题,在保证线程安全的同时显著提升并发吞吐量。
使用语法如下:
private final ConcurrentHashMap<K, V> cache = new ConcurrentHashMap<>();
常用方法如下:
方法 | 说明 | 线程安全特性 |
---|---|---|
一、基础操作:</ |