为什么 ConcurrentHashMap1.8 的扩容操作,最后一个完成任务的线程,还要再扫查一遍每个哈希桶呢?

2020-07-16 00:35:38 +08:00
 amiwrong123
            if (i < 0 || i >= n || i + n >= nextn) {
                int sc;
                if (finishing) {
                    nextTable = null;
                    table = nextTab;
                    sizeCtl = (n << 1) - (n >>> 1);
                    return;
                }
                if (U.compareAndSwapInt(this, SIZECTL, sc = sizeCtl, sc - 1)) {
                    if ((sc - 2) != resizeStamp(n) << RESIZE_STAMP_SHIFT)
                        return;
                    //执行到这里,说明当前线程是最后一个归还许可的线程
                    finishing = advance = true;//finishing 为 true,再次扫查
                    i = n; // 把遍历指针设置为 n,再从尾到头扫查一遍
                }
            }

transfer 函数里有这么一段代码,它让最后一个归还 sizeCtl 线程数的那个线程再做一遍扫查,但既然当前线程都已经是最后一个归还 sizeCtl 线程数那个线程,说明每个线程包括自己都已经完成了自己领取的 transfer 任务了,那不就没必要再从尾到头扫查一遍了吗?

还是我遗漏了什么情况

1204 次点击
所在节点    Java
0 条回复

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/690419

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX