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

你可能感兴趣的文章
Node-RED中使用node-red-contrib-image-output节点实现图片预览
查看>>
Node-RED中使用node-red-node-ui-iframe节点实现内嵌iframe访问其他网站的效果
查看>>
Node-RED中使用Notification元件显示警告讯息框(温度过高提示)
查看>>
Node-RED中使用range范围节点实现从一个范围对应至另一个范围
查看>>
Node-RED中实现HTML表单提交和获取提交的内容
查看>>
Node-RED中将CSV数据写入txt文件并从文件中读取解析数据
查看>>
Node-RED中建立TCP服务端和客户端
查看>>
Node-RED中建立Websocket客户端连接
查看>>
Node-RED中建立静态网页和动态网页内容
查看>>
Node-RED中解析高德地图天气api的json数据显示天气仪表盘
查看>>
Node-RED中连接Mysql数据库并实现增删改查的操作
查看>>
Node-RED中通过node-red-ui-webcam节点实现访问摄像头并截取照片预览
查看>>
Node-RED中配置周期性执行、指定时间阶段执行、指定时间执行事件
查看>>
Node-RED安装图形化节点dashboard实现订阅mqtt主题并在仪表盘中显示温度
查看>>
Node-RED怎样导出导入流程为json文件
查看>>
Node-RED订阅MQTT主题并调试数据
查看>>
Node-RED通过npm安装的方式对应卸载
查看>>
node-request模块
查看>>
node-static 任意文件读取漏洞复现(CVE-2023-26111)
查看>>
Node.js 8 中的 util.promisify的详解
查看>>