Java ConcurrentHashMap 的实现与原理

本文介绍了Java中ConcurrentHashMap在不同版本中的发展,从JDK1.5的传统同步容器到1.7的分段锁设计,再到1.8的链表/红黑树结构,以提高并发性能。ConcurrentHashMap是Hashtable的高效替代品,通过粒度更细的锁机制优化线程安全。

1. 概念

在JDK 1.5之前,Java中提供了 Hashtable 和 Collections.synchronizedMap 等同步容器来实现在多线程环境下的线程安全操作。

但是,这些同步容器通常存在性能问题,因为它们在对整个容器进行加锁时会导致并发性能下降。

为了改善这个问题,在JDK 1.5 时,引入了 ConcurrentHashMap。在 JDK 1.7 时,ConcurrentHashMap 使用了分段锁(Segment Locking),不同于传统的同步容器,它是将整个容器分成多个独立的部分,也就是由多个 Segment 组合,并且每个 Segment 都有自己的锁。因此,在并发访问情况下,不同的线程可以同时访问不同的 Segment,从而提高了并发性能,所以可以说 ConcurrentHashMap 是 Hashtable 的替代品。

2. 类体系结构

  • 继承了 AbstractMap 类
  • 实现了 ConcurrentMap 和 Serializable 接口
  • 间接实现了 Map 接口

3. Java 1.7

JDK 1.7 中,ConcurrentHashMap 采用 Segment 数组 + HashEntry 数组 + 链表 的方式进行实现,采用分段锁保证并发情况下的线程安全性,它的目的是将整个哈希表分割成多个独立的小型哈希表(Segments),每个 Segment 都有自己的锁。

ConcurrnetHashMap 由很多个 Segment 组合,默认 Segment 的个数是 16 个,但是 Segment 的个数一旦初始化就不能改变,你也可以认为 ConcurrentHashMap 默认支持最多 16 个线程并发。

一个 ConcurrentHashMap 包含着一个 Segment 数组,一个 Segment 包含着一个 HashEntry 数组,而 HashEntry 是一个链表结构,如果要获取 HashEntry 中的元素,要先获得 Segment 的锁。

 4. Java 1.8

从JDK 1.8开始,ConcurrentHashMap 的底层实现发生改变,采用数组 + 链表/红黑树的数据结构来存储键值对。

采用 CAS + synchronized 来保证线程安全。synchronized只锁链表或红黑树的头节点,是一种相比于 Segment 粒度更小的锁,可以使锁的竞争变小,提高并发性能与效率。

Java 8中的ConcurrentHashMap是线程安全的哈希表实现,它支持并发读写操作而不需要全局定。它的实现原理主要有以下几个方面: 1. 分段策略:ConcurrentHashMap将整个数据结构分成若干个Segment(段),每个Segment维护着一个独立的散列桶数组。每个Segment内部都有一个可重入,不同的线程可以同时访问不同的Segment,从而实现并发读写的能力。 2. 散列桶数组:ConcurrentHashMap使用散列桶数组来存储键值对。每个散列桶上都有一个链表,用于解决哈希冲突。当多个键映射到同一个散列桶时,它们会被链接到同一个链表上。 3. CAS操作:ConcurrentHashMap使用CAS(Compare and Swap)操作来保证并发更新操作的原子性。CAS是一种无算法,它通过比较内存中的值期望值是否相等来确定是否更新。如果相等,则执行更新操作;否则,重新尝试。 4. 扩容机制:ConcurrentHashMap在插入新元素时,如果当前Segment的负载因子(即链表长度)超过阈值,则会触发扩容操作。扩容时,会创建一个新的散列桶数组,并将原来的键值对重新分配到新的散列桶中。这个过程可以通过加来保证线程安全。 总的来说,ConcurrentHashMap通过分段策略、散列桶数组、CAS操作和扩容机制来实现线程安全的并发读写操作。它在多线程环境下能够提供较好的性能和可伸缩性。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值