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

你可能感兴趣的文章
PHP5.4 + IIS + Win2008 R2 配置
查看>>
PHP5.4 pfsocketopen函数判断sock是否存活的bug(由memcached引起)
查看>>
Redis从入门到精通
查看>>
PHP5.6.x编译报错:Don't know how to define struct flock on this system, set --enable-opcache=no
查看>>
php5ts.dll 下载_php5ts.dll下载
查看>>
php7
查看>>
PHP7 新特性
查看>>
PHP7+MySQL5.7+Nginx1.9. on Ubuntu 14.0
查看>>
php7.1.6 + redis
查看>>
php7中使用php_memcache扩展
查看>>
PHP7中十个需要避免的坑
查看>>
php7和PHP5对比的新特性和性能优化
查看>>
PHP7安装pdo_mysql扩展
查看>>
PHP7实战开发简单CMS内容管理系统(7) 后台登录架构 用户登录校验
查看>>
php7,从phpExcel升级到PhpSpreadsheet
查看>>
PHP8.1 + ThinkPHP实战指南:高效构建现代化网站的六大技巧
查看>>
PHP8中match新语句的操作方法
查看>>
PHP:第一章——PHP中常量和预定义常量
查看>>
PHP:第一章——PHP中的位运算
查看>>
phpcms
查看>>