HashMap 与 ConcurrentHashMap 的实现原理是怎样的?
# HashMap 与 ConcurrentHashMap 的实现原理是怎样的?ConcurrentHashMap 是如何保证线程安全的?
HashMap | ConcurrentHashMap | |
---|---|---|
是否线程安全 | 不安全 | 安全 |
JDK1.7-数据结构 | 数组+链表 | 数组+链表+Segment |
JDK1.7-数据结构-图示 | ||
锁粒度 | --- | 对segment加锁,最大并发修改线程数=segment数量 |
--- | --- | --- |
JDK1.8-数据结构 | 数组+链表+红黑树 | 数组+链表+红黑树 |
JDK1.8-数据结构-图示 | ||
锁粒度 | --- | HashEntry(首节点),最大并发修改线程数=数组.size |
Q1:ConcurrentHashMap 中变量使用 final 和 volatile 修饰有什么用呢?
A:Final域使得确保初始化安全性(initialization safety)成为可能,初始化安全性让不可变形对象不需要同步就能自由地被访问和共享。
Node的元素val和指针next是用 volatile 修饰的,在多线程环境下线程A修改结点的val或者新增节点的时候是对线程B可见的。
Q2:ConcurrentHashMap在JDK 7和8之间的区别
A:去掉了Segment这种数据结构
增加了红黑树结构来优化链表,解决了长链表遍历慢的问题
编辑 (opens new window)
上次更新: 2022/05/19, 21:26:01