首页 新闻 会员 周边

关于ConcurrentHashMap的rehash过程

0
悬赏园豆:50 [已解决问题] 解决于 2018-09-27 10:35

关于ConcurrentHashMap的rehash过程,看了源码及网上的一些资料,有点困惑。

现有如下图所示的segment

现由于添加新元素,进行rehash操作

rehash的源码如下:

当遍历到index=2的数组位置时,lastRun应该时多少?我得出的时(2,d)这个节点

感觉跟下图中的说法有冲突

不知道我哪个地方理解错了。

有没有大佬帮忙解答下,谢了。

汉有游女,君子于役的主页 汉有游女,君子于役 | 初学一级 | 园豆:154
提问于:2018-09-26 18:16
< >
分享
最佳答案
0

问题已自己解决


上图是我的理解。

之前的疑惑时由于

上图标红的地方给我造成的误区。// 这里就是遍历找到最后一个不在原桶序号处的元素
这句话感觉描述的不是很准确,应该修改为 // 这里就是遍历找到最后一个在桶中位置不在变化的元素 感觉会好点。
就好比

这个链表,最后不在变化的是(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的位置;

所以说,// 这里就是遍历找到最后一个不在原桶序号处的元素 感觉这个描述不是很准确

以上是我的理解,如果有问题,还希望能够提出来。

汉有游女,君子于役 | 初学一级 |园豆:154 | 2018-09-27 10:33
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册