放置第一个元素时,初始化了存储桶的数量:
小部分:
在阅读源代码之前,最好熟悉源代码:JDK 8新功能Longadder源代码分析
方法:添加了每个附加元素后,元素的数量为加1,并确定它是否已达到容量扩展的阈值。当它相遇时,它会得到扩展或辅助。
小部分:
引入了上述方法及其相关方法。接下来,以下内容很难引入此方法。最好手动组合源代码以分析并仔细理解上述内容。
传输(节点
该方法的作用是:迁移元素,在扩展过程中表的两倍,并将所有元素迁移到Nexttable的其他桶中。迁移该方法数据的过程是,当容量扩展时,从散布着散布时原始表的列表,奖金出价是根据枪管位置出价的,并且每个桶中的元素(节点,链接列表,树)迁移到新表中的新表格。
此外,与之相关:协助扩大能力(迁移元素)。当线程添加元素时,发现相应的枪管位置的头节点是FWD节点,表明表正在扩展枪管的元素。
下图显示了复杂的容量图。在分析源代码之前,您将熟悉该过程:
链接迁移示意图:
此外,Lastrun机制示意图:
小部分:
:协助扩展(迁移元素)。当线程添加元素时,发现阵列表正在扩展,并且当前元素的位置已迁移,并且其他枪管的元素得到了迁移。其他枪管元件的搬迁。
方法:获取元素,关键点是根据目标键所在的枪管的第一个元素的不同方式重写该方法。
在该方法的情况2中,将有两种情况:
让我们分析以下情况,即当前的枪管是FWD节点。让我们分析FWD的内部类别及其内部方法:
小部分:
方法:删除元素,例如添加元素,都可以找到元素所在的枪管,然后使用分段锁定的思想来锁定整个桶,然后操作。
在这一点上,大致完成了ConcurrentHashMap的源代码。如果有任何错误,请更正,谢谢大家!
原始:https://juejin.cn/post/7094897234168430606