关于ConcurrentHashMap的rehash过程,看了源码及网上的一些资料,有点困惑。
现有如下图所示的segment
现由于添加新元素,进行rehash操作
rehash的源码如下:
当遍历到index=2的数组位置时,lastRun应该时多少?我得出的时(2,d)这个节点
感觉跟下图中的说法有冲突
不知道我哪个地方理解错了。
有没有大佬帮忙解答下,谢了。
问题已自己解决
上图是我的理解。
之前的疑惑时由于
上图标红的地方给我造成的误区。// 这里就是遍历找到最后一个不在原桶序号处的元素
这句话感觉描述的不是很准确,应该修改为 // 这里就是遍历找到最后一个在桶中位置不在变化的元素 感觉会好点。
就好比
这个链表,最后不在变化的是(2,d)这个元素,index为2(序号并没有发生改变,还是在原来的位置);将以(2,d)开头的链表放在序号2位置,然后在对之后进入链表的元素,也就是(6,a)进行重排,然后放到序号为6的位置;
再看下图:
这个链表,最后不在变化的是(14,s)这个元素,index为6(序号发生改变);将以(14,s)开头的链表(14,s)-->(22,p)-->(30,x)放在序号6位置,然后在对之后进入链表的元素,也就是(6,a)-->(2,d)-->(18,c)进行重排,(6,a)放到序号为6的位置,(2,d)-->(18,c)然后放到序号为2的位置;
所以说,// 这里就是遍历找到最后一个不在原桶序号处的元素 感觉这个描述不是很准确
以上是我的理解,如果有问题,还希望能够提出来。