ConcurrentHashMap

在并发编程中,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的结构图:

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