ConcurrentHashMap 源码分析 -ConcurrentHashMap 与 HashMap 的异同
ConcurrentHashMap 源码分析
前言
当线程不安全的场景下,并且需要使用到 Map 们第一个想到的估计就是 ConcurrentHashMap 了,因为 ConcurrentHashMap 内部封装了锁和各种数据结构来保证访问 Map 是线程安全的。
ConcurrentHashMap 特点
所有的操作都是线程安全的,在使用时无需再进行加锁;
多个线程同时进行 put、remove 等操作时并不会阻塞,可以同时进行;
迭代过程中,即使 Map 结构被修改,也不会抛 ConcurrentModificationException 异常;
提供了很多 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 时,几乎可以直接切换,而不用考虑其他兼容性的问题。
不同:
ConcurrentHashMap 与 HashMap 在红黑树结构上有所不同,HashMap 红黑树节点 TreeNode 不仅仅有属性,还维护着红黑树的结构,包括查找功能;ConcurrentHashMap 中的红黑树节点 TreeNode 仅维护了属性和查找功能,新增了 TreeBin,来维护红黑树结构,并负责根节点的加锁和解锁。
评论