C/C++教程

ConcurrentHashMap源码解析文章总目录

本文主要是介绍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中没有thresholdloadFactor这两个字段,而是采用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源码解析文章总目录的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!