ConcurrentHashMap

本文介绍了ConcurrentHashMap在并发编程中的重要性,分析了其相较于HashMap和Hashtable的优势,并详细解释了ConcurrentHashMap通过分段锁技术实现高效并发访问的原理。

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

在并发编程中,ConcurrentHashMap是一个经常被使用的数据结构,下面简单介绍一下ConcurrentHashMap的底层结构。


 下面大概从几个问题深入去介绍一下ConcurrentHashMap

一、什么是ConcurrentHashMap?为什么要引ConcurrentHashMap?


    1、HashMap线程是不安全,它的线程不安全主要发生在put等对HashEntry有直接写操作的地方:

        HashMap线程不安全主要可能发生在这两个地方:

                * key已经存在,需要修改HashEntry对应的value;

                * key不存在,在HashEntry中做插入。

 

    2、Hashtable线程安全,但是效率低下:
               Hashtable是用synchronized关键字来保证线程安全的,但synchronized的机制是在同一时刻只能有

        一个线程操作,其他的线程阻塞或者轮询等待,在线程竞争激烈的情况下,这种方式的效率会非常的低下。


    ConcurrentHashMap是线程安全并且高效的HashMap,在并发编程中经常可见它的使用。

二、ConcurrentHashMap为什么高效?

    Hashtable效率低的原因是所有访问Hashtable的线程都争夺一把锁。


    如果容器有很多把锁,每一把锁控制容器中的一部分数据,那么当多个线程访问容器里的不同部分的数据时,线程之前就不会存在锁的竞争,这样就可以有效的提高并发的访问效率。


    这也正是ConcurrentHashMap使用的分段锁技术。将ConcurrentHashMap容器的数据分段存储,每一段数据分配一个Segment(锁),当线程占用其中一个Segment时,其他线程可正常访问其他段数据。

三、ConcurrentHashMap里为什么分segment


        这正是ConcurrentHashMap高明之处,我们都知道锁只在segment中存在,这样就把锁的粒度变小,提高并发,同时还是线程安全的,

ConcurrentHashMap的结构图:


        * Segment是可重入锁,它在ConcurrentHashMap中扮演   分离锁的角色;
        * HashEntry主要存储键值对;
      * ConcurrentHashMap包含一个Segment数组,每个Segment包含一个HashEntry数组并且守护它,当修改HashEntry  数组数据时,需要先获取它对应的Segment锁;而HashEntry数组采用开链法处理冲突,所以它的每个HashEntry元素又是链表结构的元素。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值