7.jdk源码阅读之ConcurrentHashMap(上)

1.写在前面

上一篇文章,我们分析了一下HashMap的源码,这篇文章我们一起来看下ConcurrentHashMap的源代码,我先抛出几个问题:

  1. ConcurrentHashMap 和 HashMap有什么区别?比如创建、往Map中放入元素等等
  2. ConcurrentHashMap是怎么做到并发安全的?
import java.util.concurrent.ConcurrentHashMap;

public class ConcurrentHashMapExample {
    public static void main(String[] args) {
        ConcurrentHashMap<String, Integer> map = new ConcurrentHashMap<>();

        // 插入元素
        map.put("apple", 1);
        map.put("banana", 2);
        map.put("cherry", 3);

        // 获取元素
        System.out.println("apple: " + map.get("apple"));
        System.out.println("banana: " + map.get("banana"));
        System.out.println("cherry: " + map.get("cherry"));

        // 更新元素
        map.put("apple", 10);
        System.out.println("updated apple: " + map.get("apple"));

        // 删除元素
        map.remove("banana");
        System.out.println("banana after removal: " + map.get("banana"));
    }
}

上面的代码介绍了ConcurrentHashMap的基本用法,我们接下来详细看看各个部分

2. 全局视角

在这里插入图片描述

  • AbstractMap 是 java.util 包中的一个抽象类,它提供了 Map 接口的骨架实现。ConcurrentHashMap 继承了 AbstractMap,并实现了 Map 接口的具体方法。
  • ConcurrentMap 是 java.util.concurrent 包中的一个接口,它扩展了 Map 接口,定义了一些额外的线程安全操作,如 putIfAbsent、remove 和 replace 等。
  • Serializable 是 Java 的一个标记接口,表示实现该接口的类可以被序列化。ConcurrentHashMap 实现了 Serializable 接口,以支持对象的序列化和反序列化。

3. 数据结构

在 JDK 8 中,ConcurrentHashMap 采用了一种混合的数据结构,结合了数组、链表和红黑树,以提高在不同负载下的性能。

  • 数组(Node<K,V>[] table):存储键值对的主要结构。
  • 链表:用于解决哈希冲突,当冲突不多时使用链表存储冲突的元素。
  • 红黑树:当链表长度超过一定阈值时(默认是 8),链表会转换成红黑树,以提高查询效率。

4. put操作实现原理

ConcurrentHashMap 的 put 操作是线程安全的,下面是其主要流程:

  1. 计算哈希值:根据键计算哈希值。
  2. 定位数组索引:根据哈希值定位到数组中的具体位置。
  3. CAS 操作初始化数组:如果数组未初始化,则通过 CAS 操作初始化数组。
  4. 插入元素:根据数组中当前位置的状态进行不同的操作:
  • 如果当前位置为空,则通过 CAS 操作插入元素。
  • 如果当前位置不为空且是链表结构,则遍历链表,检查是否存在相同的键,如果存在则更新值,否则插入新节点。
  • 如果当前位置是红黑树结构,则在树中插入元素
  1. 扩容:如果插入后数组的负载因子超过阈值,则触发扩容

系列文章

1.JDK源码阅读之环境搭建

2.JDK源码阅读之目录介绍

3.jdk源码阅读之ArrayList(上)

4.jdk源码阅读之ArrayList(下)

5.jdk源码阅读之HashMap

6.jdk源码阅读之HashMap(下)

7.jdk源码阅读之ConcurrentHashMap(上)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

至真源

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值