【323、ConcurrentHashMap,1.7和1.8有哪些区别?】

325 阅读1分钟

ConcurrentHashMap 是 Java 并发包中提供的线程安全的哈希表,可以用于高并发的场景。在 Java 1.7 和 Java 1.8 中,ConcurrentHashMap 的实现有一些区别,主要包括以下几个方面:

  1. 实现方式

在 Java 1.7 中,ConcurrentHashMap 的实现基于分段锁(Segment),将哈希表分成多个段,每个段都有自己的锁,可以支持并发的访问。在 Java 1.8 中,ConcurrentHashMap 的实现基于 CAS(Compare and Swap)操作和 Synchronized,可以更加高效地实现并发操作。

  1. 大小调整机制

在 Java 1.7 中,ConcurrentHashMap 的大小调整机制是基于 rehashing 的,即需要将原有的数据重新分配到新的桶中,这个过程需要加锁,会影响并发性能。在 Java 1.8 中,ConcurrentHashMap 的大小调整机制是基于扩容和分段锁的,只需要锁定需要扩容的段,可以避免锁定整个哈希表。

  1. 并发度

在 Java 1.7 中,ConcurrentHashMap 的默认并发度是 16,也就是默认会创建 16 个段。在 Java 1.8 中,默认的并发度是 CPU 核心数的两倍,可以根据实际情况进行调整。

  1. 数据结构

在 Java 1.7 中,ConcurrentHashMap 的数据结构是数组+链表+分段锁,每个段都有自己的数组和链表,数据的存储方式类似于 HashMap。在 Java 1.8 中,ConcurrentHashMap 的数据结构是数组+链表/红黑树+CAS/Synchronized,当链表长度超过一定阈值时,会将链表转化为红黑树,可以提高查询的效率。

总的来说,Java 1.8 中的 ConcurrentHashMap 相对于 Java 1.7 中的版本在并发性能、调整大小机制等方面有所改进,可以更好地支持高并发的场景。