Java ConcurrentHashMap 的实现与原理

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 粒度更小的锁,可以使锁的竞争变小,提高并发性能与效率。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值