博客
关于我
高并发(六)--ConcurrentHashMap 源码解析
阅读量:147 次
发布时间:2019-02-28

本文共 1367 字,大约阅读时间需要 4 分钟。

JDK 1.7 和 JDK 1.8 中的 ConcurrentHashMap 区别

ConcurrentHashMap 在 Java 中的发展经历了从 1.7 到 1.8 的重大变革,这些变革不仅改变了其内部实现方式,还显著提升了性能和可扩展性。本文将从多个方面探讨这两种版本之间的主要区别。

1. 锁机制

  • JDK 1.7:采用分段锁技术。ConcurrentHashMap 由多个 Segment 组成,每个 Segment 都有一个独占锁。当一个线程占用锁访问其中一段数据时,其他段的数据仍可被其他线程访问。这种方式的优点是支持较高的并发度,但锁竞争可能导致效率下降,特别是在多个线程同时操作同一 Segment 时。

  • JDK 1.8:采用锁分离机制。这种机制使用 CAS(比较与交换)加上 Synchronized 锁。锁只锁定特定的 Node,而不是整个 Segment。这种方式锁粒度更细,减少了锁竞争的可能性,从而提高了效率。

2. 数据结构

  • JDK 1.7:使用Segment + HashEntry结构。Segment 是一个数组,每个 Segment 中包含一个 HashEntry 数组。HashEntry 包含键 Key、值 Value 以及键的哈希值。这种结构在并发环境下提供线程安全,但在哈希冲突较多的情况下,查找效率较低。

  • JDK 1.8:使用数组 + 链表 + 红黑树结构。ConcurrentHashMap 的主要变化是将链表替换为红黑树,当链表长度超过一定阈值(如 8)时。这种结构在单个链表长度较长时,可以通过树状结构提升查找效率。同时,红黑树的引入减少了链表操作的开销,使得查找和插入操作更加高效。

3. 扩容机制

  • JDK 1.7:当链表长度超过阈值时,触发扩容。扩容时,使用 CAS 技术对链表进行迁移操作,尽量减少锁竞争。然而,扩容过程可能在多线程环境下效率不高。

  • JDK 1.8:引入了多线程扩容支持。在扩容过程中,允许多个线程同时迁移数据,减少了扩容的瓶颈。新的迁移机制支持更高效的数据迁移,提升了整体性能。

4. 初始化延迟

  • JDK 1.7:初始化延迟到第一个插入操作时。这种方式可以避免在构造函数中进行大量初始化工作,但可能在初始容量较低的情况下带来性能影响。

  • JDK 1.8:延迟初始化的方式与 1.7 类似,但优化了初始化过程,使其更高效。部分初始化操作可以通过 CAS 技术进行,并且避免了在空槽上的重复初始化。

5. 性能

  • JDK 1.7:在单线程环境下表现优异,但在多线程环境下,由于分段锁的粒度较大,可能存在锁竞争,影响性能。

  • JDK 1.8:通过锁粒度更细的机制和红黑树的引入,显著提升了并发性能。在高并发场景下,查找和插入操作的效率更高,整体性能更优。

6. 其他改进

  • JDK 1.8 还引入了新的控制变量,如 sizeCtl,用于更精确地控制集合的大小,并支持更灵活的扩容策略。迁移机制也更加高效,支持多线程并行迁移,减少了扩容的延迟。

总结

JDK 1.8 的 ConcurrentHashMap 在锁机制、数据结构、扩容机制和性能上均进行了优化,支持了更高效的并发操作。在高并发环境下,JDK 1.8 的版本显著优于其前代,成为 Java 并发编程中的更优选择。

转载地址:http://mvwc.baihongyu.com/

你可能感兴趣的文章
Python pandas 数据清洗与数据绘图实战
查看>>
Python输出信息
查看>>
Python Pandas 用顶行替换标题
查看>>
Python pandas 通过 dt 访问器有效地将日期时间转换为时间戳
查看>>
Python Pandas-从DataFrame按类别绘制多个条形图
查看>>
Python Pandas:每月或每周拆分 TimeSerie
查看>>
python pandas中融化的对面
查看>>
python pandas从时间序列中提取唯一日期
查看>>
python pandas库详解_Pandas 库的详解和使用补充
查看>>
Python Pandas滚动聚合一列列表
查看>>
python pandas相关知识点(练习)
查看>>
Python Pandas,从.groupby().Apply()中的GROUP中分割行
查看>>
Python pathlib模块详解:优雅处理文件路径
查看>>
python pickle 模块的使用
查看>>
Python PIL/Pillow-Pad图像至所需大小(例如,A4)
查看>>
python PIL模框使用
查看>>
Python ping 模块
查看>>
Python Pingouin:搞定各种假设检验和统计模型 !
查看>>
Python pip 国内镜像大全及使用办法
查看>>
Python pip工具使用
查看>>