1、简要介绍
Java7 中 ConcurrentHashMap 使用的分段锁,也就是每一个 Segment 上同时只有一个线程可以操作,每一个 Segment 都是一个类似 HashMap 数组的结构,它可以扩容,它的冲突会转化为链表。但是 Segment 的个数一但初始化就不能改变。
Java8 中的 ConcurrentHashMap 使用的 Synchronized 锁加 CAS 的机制。结构也由 Java7 中的 Segment 数组 + HashEntry 数组 + 链表 进化成了 Node 数组 + 链表 / 红黑树,Node 是类似于一个 HashEntry 的结构。它的冲突再达到一定大小时会转化成红黑树,在冲突小于一定数量时又退回链表。
2、jdk1.5之前,jdk提供的Map同步容器有:
1、使用Hashtable类。Hashtable使用synchronized同步锁修饰put、get、remove等方法,读写只能串行进行,性能低下。
2、使用Collections.synchronizedMap返回一个同步代理类synchronizedMap。可以将指定集合包装成线程同步的集合。
3、
ConcurrentHashMap继承了Abstract抽象类,实现了ConcurrentMap接口。
Abstract抽象类减少了实现Map数据结构的工作量,ConcurrentMap接口提供了线程安全性和原子保证。
4、节点类型有5种:只有Node节点和TreeNode节点存储着真实的数据。
1、Node:连接着一个链表。
2、TreeBin:红黑树的顶级节点,hash值固定为-1,TreeBin连接着一个红黑树,红黑树节点时TreeNode,TreeBin指向红黑树的根节点。
3