ConcurrentHashMap分段加锁机制简析

本文简要分析了ConcurrentHashMap的分段加锁机制,指出其在JDK1.8中锁住的是数组元素,未发生哈希冲突时使用CAS,冲突时使用synchronized。相较于JDK1.7的segment锁,1.8版本加锁粒度更细,提升了并发性能。

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

ConcurrentHashMap是线程安全的HashMap,这个应该大家都知道,我就不多废话了,实现的思想是使用的分段加锁,使用分段加锁的作用当然就是可以有效提升并发量,可以对比一下所有操作都加锁的HashTable,就能明白分段加锁的好处了

既然说是分段加锁,那么我们可以猜想一下是根据什么依据来进行分段的呢?
我们都知道HashMap的底层是一个数组,当里面的键值对出现了hash冲突的话,就会挂载成为一个链表,链表的阈值达到了8之后就会转化为红黑树,既然底层的数据结构是数组的话,那么是否可以对数组来进行加锁呢?我们拿ConcurrentHashMap的put方法来分析一下其中的源码实现就知道了

// ConcurrentHashMap的put方法直接就是调用的类中的putVal方法,所以我这里就直接贴出来putVal方法了
final V putVal(K key, V value, boolean onlyIfAbsent) {
   
	// key和value都不允许为null,否则会报错
    if (key == null || value == null) throw new NullPointerException();
   	// 计算hash值
    int hash = spread(key.hashCode());
    // 当前链表中元素的个数
    int binCount = 0;
    // table就是底层的数组
    for (Node<K,V>[] tab = table;;) {
   
        Node<K,V> f; int n, i, fh;
        // 判断数组是否为空
        if (tab == null || (n = tab.length) == 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值