ConcurrentHashMap
在并发编程中,ConcurrentHashMap是一个经常被使用的数据结构,下面简单介绍一下ConcurrentHashMap的底层结构。
下面大概从几个问题深入去介绍一下ConcurrentHashMap
1、HashMap线程是不安全,它的线程不安全主要发生在put等对HashEntry有直接写操作的地方:
下面大概从几个问题深入去介绍一下ConcurrentHashMap
一、什么是ConcurrentHashMap?为什么要引ConcurrentHashMap?
1、HashMap线程是不安全,它的线程不安全主要发生在put等对HashEntry有直接写操作的地方:
HashMap线程不安全主要可能发生在这两个地方:
* key已经存在,需要修改HashEntry对应的value;
* key不存在,在HashEntry中做插入。
2、Hashtable线程安全,但是效率低下:
Hashtable是用synchronized关键字来保证线程安全的,但synchronized的机制是在同一时刻只能有
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元素又是链表结构的元素。