ConcurrentHashMap源码解析文章总目录
Posted 兴趣使然的草帽路飞
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ConcurrentHashMap源码解析文章总目录相关的知识,希望对你有一定的参考价值。
祝大家变得更强~
- ConcurrentHashMap源码解析_01 成员属性、内部类、构造方法分析
- ConcurrentHashMap源码解析_02 预热(内部一些小方法分析)
- ConcurrentHashMap源码解析_03 put方法源码分析
- ConcurrentHashMap源码解析_04 transfer方法源码分析(难点)
- ConcurrentHashMap源码解析_05 get、remove方法
- ConcurrentHashMap源码解析_06 红黑树的代理类(TreeBin)
下面是引用彤哥源码公众号文章中的片段: ConcurrentHashMap完整小节 上对并发HashMap的简单总结~
总结:
(1)ConcurrentHashMap是HashMap的线程安全版本;
(2)ConcurrentHashMap采用(数组 + 链表 + 红黑树)的结构存储元素;
(3)ConcurrentHashMap相比于同样线程安全的HashTable,效率要高很多;
(4)ConcurrentHashMap采用的锁有 synchronized,CAS,自旋锁,分段锁,volatile等;
(5)ConcurrentHashMap中没有threshold
和loadFactor
这两个字段,而是采用sizeCtl来控制;
(6)sizeCtl = -1
,表示正在进行初始化;
(7)sizeCtl = 0
,默认值,表示后续在真正初始化的时候使用默认容量;
(8)sizeCtl > 0
,在初始化之前存储的是传入的容量,在初始化或扩容后存储的是下一次的扩容门槛;
(9)sizeCtl = (resizeStamp << 16) + (1 + nThreads)
,表示正在进行扩容,高位存储扩容邮戳,低位存储扩容线程数加1;
(10)更新操作时如果正在进行扩容,当前线程协助扩容;
(11)更新操作会采用synchronized锁住当前桶的第一个元素,这是分段锁的思想;
(12)整个扩容过程都是通过CAS控制sizeCtl
这个字段来进行的,这很关键;
(13)迁移完元素的桶会放置一个ForwardingNode节点,以标识该桶迁移完毕;
(14)元素个数的存储也是采用的分段思想,类似于LongAdder的实现;
(15)元素个数的更新会把不同的线程hash到不同的段上,减少资源争用;
(16)元素个数的更新如果还是出现多个线程同时更新一个段,则会扩容段(CounterCell);
(17)获取元素个数是把所有的段(包括baseCount和CounterCell)相加起来得到的;
(18)查询操作是不会加锁的,所以ConcurrentHashMap不是强一致性的;
(19)ConcurrentHashMap中不能存储key或value为null的元素;
- ConcurrentHashMap中有哪些值得学习的技术呢?
- (1)CAS + 自旋,乐观锁的思想,减少线程上下文切换的时间;
- (2)分段锁的思想,减少同一把锁争用带来的低效问题;
- (3)CounterCell,分段存储元素个数,减少多线程同时更新一个字段带来的低效;
- (4)
@sun.misc.Contended
(CounterCell上的注解),避免伪共享; - (5)多线程协同进行扩容;
以上是关于ConcurrentHashMap源码解析文章总目录的主要内容,如果未能解决你的问题,请参考以下文章
ConcurrentHashMap源码夺命15问,你能坚持到第几问?
Java 实习生每日面试题打卡——ConcurrentHashMap源码夺命15问,你能坚持到第几问?
ConcurrentHashMap源码解析_05 getremove方法
ConcurrentHashMap源码解析_05 getremove方法