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

你可能感兴趣的文章
Nginx的Rewrite正则表达式,匹配非某单词
查看>>
Nginx的使用总结(一)
查看>>
Nginx的可视化神器nginx-gui的下载配置和使用
查看>>
Nginx的是什么?干什么用的?
查看>>
Nginx访问控制_登陆权限的控制(http_auth_basic_module)
查看>>
nginx负载均衡器处理session共享的几种方法(转)
查看>>
nginx负载均衡的5种策略(转载)
查看>>
nginx负载均衡的五种算法
查看>>
Nginx运维与实战(二)-Https配置
查看>>
Nginx配置ssl实现https
查看>>
Nginx配置TCP代理指南
查看>>
Nginx配置——不记录指定文件类型日志
查看>>
Nginx配置代理解决本地html进行ajax请求接口跨域问题
查看>>
Nginx配置参数中文说明
查看>>
Nginx配置好ssl,但$_SERVER[‘HTTPS‘]取不到值
查看>>
Nginx配置实例-负载均衡实例:平均访问多台服务器
查看>>
NIFI1.21.0通过Postgresql11的CDC逻辑复制槽实现_指定表多表增量同步_增删改数据分发及删除数据实时同步_通过分页解决变更记录过大问题_02----大数据之Nifi工作笔记0054
查看>>
NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_配置数据路由_实现数据插入数据到目标数据库_实际操作03---大数据之Nifi工作笔记0042
查看>>
Nifi同步过程中报错create_time字段找不到_实际目标表和源表中没有这个字段---大数据之Nifi工作笔记0066
查看>>
NIFI大数据进阶_离线同步MySql数据到HDFS_02_实际操作_splitjson处理器_puthdfs处理器_querydatabasetable处理器---大数据之Nifi工作笔记0030
查看>>