博客
关于我
高并发(六)--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/

你可能感兴趣的文章
OpenCV学习笔记(27)KAZE 算法原理与源码分析(一)非线性扩散滤波
查看>>
OpenCV学堂 | CV开发者必须懂的9种距离度量方法,内含欧氏距离、切比雪夫距离等(建议收藏)
查看>>
OpenCV学堂 | OpenCV中支持的人脸检测方法整理与汇总
查看>>
OpenCV学堂 | OpenCV案例 | 基于轮廓分析对象提取
查看>>
OpenCV学堂 | YOLOv8与YOLO11自定义数据集迁移学习效果对比
查看>>
OpenCV学堂 | YOLOv8官方团队宣布YOLOv11 发布了
查看>>
OpenCV学堂 | YOLOv8实战 | 荧光显微镜细胞图像检测
查看>>
OpenCV学堂 | 汇总 | 深度学习图像去模糊技术与模型
查看>>
OpenCV安装
查看>>
OpenCV官方文档 理解k - means聚类
查看>>
opencv实现多路播放
查看>>
opencv常用函数
查看>>
OpenCV探索
查看>>
OpenCV添加中文(五)
查看>>
opencv源码查看
查看>>
OpenCV点目标检测未找到所有目标,并且找到的圆圈偏移
查看>>
opencv特征提取1-Harris角点检测
查看>>
OpenCV环境搭建(一)
查看>>
OpenCV的视频读取
查看>>
openCV目标识别 目标跟踪 YOLO5深度学习 Python 计算机视觉 计算机毕业设计 源码下载
查看>>