[技术分享]-ConcurrentHashMap在jdk1.8中的改进

本文回顾了JDK1.7中ConcurrentHashMap的分段锁设计,并详细介绍了JDK1.8中对ConcurrentHashMap的两大改进:一是取消Segments,改为使用table数组元素作为锁;二是引入红黑树,当链表长度超过8时转换为树结构,提高查找效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、简单回顾ConcurrentHashMap在jdk1.7中的设计

  • 与Hashtable不同的是,ConcurrentHashMap使用的是分段锁技术,将ConcurrentHashMap容器的数据分段存储,每一段数据分配一个Segment,当线程占用一个Segment时,其他线程可以访问其他段的数据.(每个segment都是一个锁). 与hashtable相比,这么设计的目的是对于put, remove等操作,可以减少并发冲突,对不属于同一个片段的节点可以并发操作,大大提高了性能.

Segment : 可重入锁(在JAVA环境下 ReentrantLock 和synchronized 都是 可重入锁),继承ReentrantLock, 也称之为桶( 本质上Segment类就是一个小的hashmap,里面table数组存储了各个节点的数据,继承了ReentrantLock, 可以作为互斥锁使用 ) 每个Segment守护着一个HashEntry数组里的元素,当对HashEntry数组的数据进行修改时,必须首先获得它对应的Segment锁。

HashEntry : 主要存储键值对, 这里也可以叫节点

image


HashEntry源码:

static final class HashEntry<K,V> {
        final int hash;
        final K key;
        volatile V value;
        volatile HashEntry<K,V> next;

其中,volatile关键字保证了多线程读取的时候一定是最新值。

ConcurrentHashMap包含一个Segment数组,每个Segment包含一个HashEntry数组,当修改HashEntry数组,采用开链法处理冲突,所以它的每个HashEntry元素又是链表结构的元素。

ConcurrentHashMap构造方法<

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值