总结
众所周知 ConcurrentHashMap 是线程安全的,但是在实现上,它摒弃了1.7分段锁的机制,而是采用了CAS+自旋的无锁编程的方式实现的,在设计上,扩容的时候 利用多线程的并发能力,采用多线程协助扩容的方式实现的,在容器的数量的统计上,为了避免线程安全问题和高并发下过多的自旋,没有采用单一的size变量进行统计,而是采用了baseCount+CountCell[],进行分段统计,其中CountCell 采用@CountCell 标注避免了伪共享的问题出现,全程加锁的只有两个地方
1.put操作产生hash碰撞的时候,加锁
2,扩容的时候,迁移链表时 锁住头结点,因为迁移时,采用的头插法迁移,加锁防止成环
因为扩容和put操作都锁住了头结点,当put操作遇到当前节点正在迁移时,此时put操作会阻塞,等待迁移完成.整个扩容的图解如下,多线程从右往左完成扩容
整个的存储以及扩容的完整过程,存储以及扩容的完整过程