ConcurrentHashMap详解(作用原理及使用场景)

ConcurrentHashMap

ConcurrentHashMap是Java集合框架中的一个线程安全的哈希表实现,它支持高效地并发访问和修改操作。

 

ConcurrentHashMap作用

我们知道HashMap是线程不安全的,在多线程环境下,使用Hashmap进行put操作会引起死循环,所以并发情况下不能使用HashMap。

所以为了解决这个问题,ConcurrentHashMap就出现了,ConcurrentHashMap就是HashMap的多线程安全版本。

通常情况下,ConcurrentHashMap适用于需要高效并发访问和修改的场景,如并发编程中的缓存、计数器等。

 

ConcurrentHashMap原理

ConcurrentHashMap使用了锁分段技术、CAS、 volatile 变量来保证线程安全和数据可见性。

谈到ConcurrentHashMap原理,这里需要谈下JDK1.7和JDK1.8两个版本的ConcurrentHashMap的实现。

1.JDK1.7 ConcurrentHashMap实现原理

在JDK1.7中ConcurrentHashMap采用了数组+Segment+分段锁的方式实现。

如下图所示:
ConcurrentHashMap详解(作用原理及使用场景)-mikechen

ConcurrentHashMap采用了分段锁机制,内部将整个哈希表分成多个小的段,每个段有自己的锁。

在并发访问时,只需要锁住对应的段,而不是整个哈希表。

这种设计使得在不同的段上进行并发访问时,线程之间不会相互阻塞,从而能够提高并发性能。

 

2.JDK1.8 ConcurrentHashMap实现原理

JDK8中ConcurrentHashMap参考了JDK8 HashMap的实现,进行全面升级。

如下图所示:

ConcurrentHashMap详解(作用原理及使用场景)-mikechen

采用了数组+链表+红黑树的实现方式来设计,JDK8中彻底放弃了Segment转而采用的是Node,其设计思想也不再是JDK1.7中的分段锁思想。

在JDK8中ConcurrentHashMap的结构,采用了synchronized+CAS+HashEntry+红黑树的方式来实现。

JDK 1.8版本的ConcurrentHashMap原理实现优势,主要在于亮点:

1.锁的颗粒度更小,当数据落在数组上时,使用cas锁头节点,当发生冲突时数据落在节点上时,使用synchronized锁冲突的节点减少了并发冲突。

2.当链表长度>8时,将会转化为红黑树,查询效率更高。

 

ConcurrentHashMap使用示例

下面是 ConcurrentHashMap 的使用示例:

import java.util.concurrent.ConcurrentHashMap;

public class ConcurrentHashMapDemo {
    public static void main(String[] args) {
        ConcurrentHashMap<String, String> map = new ConcurrentHashMap<>();
        map.put("key1", "value1");
        map.put("key2", "value2");
        map.put("key3", "value3");
        
        String value1 = map.get("key1");
        String value2 = map.get("key2");
        String value3 = map.get("key3");
        
        System.out.println(value1);
        System.out.println(value2);
        System.out.println(value3);
    }
}

以上示例中,我们首先创建了一个 ConcurrentHashMap 对象,然后向其中添加了三个键值对。

 

ConcurrentHashMap使用场景

在以下情况下,可以考虑使用 ConcurrentHashMap:

  1. 需要高并发读写的场景:ConcurrentHashMap 的读操作不会被阻塞,因此可以支持高并发的读取。同时,它的写操作也是线程安全的,可以避免多个线程同时修改同一个数据的问题。
  2. 需要高效的并发性能:相对于 Hashtable 或者 Collections.synchronizedMap() 等同步的哈希表实现,ConcurrentHashMap 在高并发情况下有更好的性能表现。
  3. 需要灵活的容量控制:ConcurrentHashMap 允许设置初始化容量和负载因子,可以根据实际情况进行调整,以达到更好的性能表现。

以上就是ConcurrentHashMap的详解,希望对你掌握ConcurrentHashMap有所帮助!

 

陈睿mikechen

10年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。

关注「mikechen」公众号,获取更多技术干货!

后台回复面试即可获取《史上最全阿里Java面试题总结》,后台回复架构,即可获取《阿里架构师进阶专题全部合集

评论交流
    说说你的看法