写点什么

ConcurrentHashMap 源码分析 -ConcurrentHashMap 与 HashMap 的异同

作者:zarmnosaj
  • 2022 年 6 月 10 日
  • 本文字数:812 字

    阅读完需:约 3 分钟

ConcurrentHashMap 源码分析

前言

当线程不安全的场景下,并且需要使用到 Map 们第一个想到的估计就是 ConcurrentHashMap 了,因为 ConcurrentHashMap 内部封装了锁和各种数据结构来保证访问 Map 是线程安全的。

ConcurrentHashMap 特点

  1. 所有的操作都是线程安全的,在使用时无需再进行加锁;

  2. 多个线程同时进行 put、remove 等操作时并不会阻塞,可以同时进行;

  3. 迭代过程中,即使 Map 结构被修改,也不会抛 ConcurrentModificationException 异常;

  4. 提供了很多 Stream 流式方法,比如说:forEach、search、reduce 等等。

ConcurrentHashMap 结构

ConcurrentHashMap 的底层数据结构和方法的实现细节和 HashMap 差不多,但是在类的继承及实现结构上没有关联关系。


ConcurrentHashMap 很多方法和代码都和 HashMap 类似,按理说通过继承就可以很好的实现 ConcurrentHashMap,但是为什么需要重新一套呢,原因是 ConcurrentHashMap 的内部源码中,恨锁锁都是在方法内部加的,而非是方法外部加,如果用继承实现,很难在方法内部中加锁,一般只能在方法声明上加锁。这也是为什么 ConcurrentHashMap 没有直接继承 HashMap 来直接使用的原因。

ConcurrentHashMap 和 HashMap 的异同

相同:ConcurrentHashMap 与 HashMap 中的数组、链表结构几乎是一样的,并且底层对数据结构的操作逻辑也基本是相同的,但是有一些实现细节不同。


ConcurrentHashMap 和 HashMap 都实现了 Map 接口,并且都继承了 AbstractMap 抽象类,所以大多数的方法也都是相同的,HashMap 有的方法,在 ConcurrentHashMap 中 几乎都有,所以有场景若是需要从 HashMap 切换到 ConcurrentHashMap 时,几乎可以直接切换,而不用考虑其他兼容性的问题。


不同:


  1. ConcurrentHashMap 与 HashMap 在红黑树结构上有所不同,HashMap 红黑树节点 TreeNode 不仅仅有属性,还维护着红黑树的结构,包括查找功能;ConcurrentHashMap 中的红黑树节点 TreeNode 仅维护了属性和查找功能,新增了 TreeBin,来维护红黑树结构,并负责根节点的加锁和解锁。

用户头像

zarmnosaj

关注

靡不有初,鲜克有终 2020.02.06 加入

成都后端混子

评论

发布
暂无评论
ConcurrentHashMap 源码分析-ConcurrentHashMap与HashMap的异同_6月月更_zarmnosaj_InfoQ写作社区