一、介绍
1.概念
ConcurrentHashMap是HashMap的线程安全版本,相对 HashMap 和 Hashtable, ConcurrentHashMap 增加了 Segment 层,每个 Segment 原理上等同于一个 Hashtable, ConcurrentHashMap 为 Segment 的数组。
向 ConcurrentHashMap 中插入数据或者读取数据,首先都要讲相应的 Key 映射到对应的 Segment,因此不用锁定整个类, 只要对单个的 Segment 操作进行上锁操作就可以了。理论上如果有 n 个 Segment,那么最多可以同时支持 n 个线程的并发访问,从而大大提高了并发访问的效率。
注:hashmap的key和value可以为null,但是concurrentHashMap的key和value不能为null
2. ConcurrentHashMap 在 jdk1.7 的升级到 1.8 中的变化
-
改进一:取消 segments 字段,直接采用 transient volatile HashEntry<K,V>[] table 保存数据,采用 table 数组元素作为锁,锁的粒度从多个 Node 级别又减小到一个 Node 级别,再度减小锁竞争,减小程序同步的部分。
-
改进二:将原先 table 数组+单向链表的数据结构,变更为 table 数组