

- JDK7中的的 ConcurrentHashMap 由 Segment 和 HashEntry 组成,即 ConcurrentHashMap 把哈希桶数组切分成小数组(Segment),每个小数组有 n 个 HashEntry 组成。
- 将数据分为一段一段的存储,然后给每一段数据配一把锁,当一个线程占用锁访问其中一段数据时,其他段的数据也能被其他线程访问,实现并发访问。

- Segment 是 ConcurrentHashMap 的一个内部类主要的组成,继承自 ReentrantLock,volatile 修饰 HashEntry<K,V>[] table 可以保证在数组扩容时的可见性。
- volatile 修饰 HashEntry 的数据 value 和下一个节点 next,保证了多线程环境下数据获取时的可见性!

- JDK8 中ConcurrentHashMap 选择了与 HashMap 相同的 Node 数组 + 链表 + 红黑树结构
- 在锁的实现上,抛弃了原有的 Segment 分段锁,采用 CAS + synchronized 实现更加细粒度的锁。将锁的级别控制在了更细粒度的哈希桶数组元素级别,只需要锁住这个链表头节点(红黑树的根节点),就不会影响其他的哈希桶数组元素的读写,大大提高了并发度。

