跳至主要內容

ConcurrentHashMap源码解析

fangzhipeng约 4774 字大约 16 分钟

ConcurrentHashMap介绍

ConcurrentHashMap 是 Java 并发包中提供的一个线程安全的哈希表实现。它被设计用来在多线程环境下进行并发访问,并且可以在高并发情况下提供更好的性能表现。在Java7版本和Java8~21的实现非常不同

Java7 基于分段锁的ConcurrentHashMap

在Java 7中,ConcurrentHashMap实现了基于分段锁的并发访问机制。

Java 7中对ConcurrentHashMap进行了改进,引入了分段锁机制。

分段锁的基本思想是将整个数据结构分成多个段(Segment),每个段拥有自己的锁。这样一来,多个线程可以同时访问不同的段,从而提高并发性能。

具体实现上,ConcurrentHashMap中使用了一个Segment数组,每个Segment中维护一个HashEntry数组,其中每个HashEntry是一个键值对。每个Segment拥有自己的锁对象,当多个线程访问不同的段时,它们可以同时进行操作,互不影响。

通过使用分段锁,ConcurrentHashMap在Java 7中可以提供更高的并发性能,并且保持较低的锁竞争。这使得ConcurrentHashMap成为处理高并发情况下的线程安全哈希表的理想选择。

img
img

Java 8基于CAS的ConcurrentHashMap

在Java 8中,ConcurrentHashMap的实现发生了重大变化,它放弃了基于分段锁的实现,而是转而采用基于CAS(Compare and Swap)。

Java 8中的ConcurrentHashMap摒弃了分段锁,而是采用了一种全新的数据结构和算法,基于CAS操作来实现对并发更新的支持。

在Java 8中,ConcurrentHashMap使用了NodeTreeNode来表示哈希表中的节点,这些节点被组织成一个数组。在进行插入、删除和查找等操作时,ConcurrentHashMap使用CAS操作来保证线程安全。

基于CAS的算法能够在多线程并发修改共享数据时,通过硬件的原子性指令来实现线程安全的更新操作,而不需要使用传统的锁机制。这使得ConcurrentHashMap在高并发情况下拥有更好的性能表现,减少了锁竞争的影响。

img
img

ConcurrentHashMap使用示例

示例代码如下:

import java.util.concurrent.ConcurrentHashMap;

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

        // 插入元素
        map.put("A", 1);
        map.put("B", 2);
        map.put("C", 3);

        // 删除元素
        map.remove("B");

        // 查询元素
        int valueA = map.get("A");
        System.out