那多线程间是如何分配任务的呢?如何将元素从旧数组迁移到新数组的呢?让我再来给你捋捋:
(3.1)多线程间是如何分配任务
首先看开头步长的概念,任务分配单元,就是一次分给线程个位置的元素迁移任务 。只考虑多核的情况计算方式是将原数组的长度分成8份,然后再等分给每个cpu,但是最小步长是=16 。
记录迁移的进度,初始为原数组的长度n,逆序进行 。转发节点,某个位置的元素迁移完了但是整个迁移任务还没结束,这个位置就会被占位,写线程遇到会帮助扩容,读线程遇到转发请求 。
每次线程分配的任务区间为[-, ),每次递减 。源码中是首先会把最新的赋值给,然后-赋值给,同时cas更新为,即分配了一个单位的任务,一个单位任务的区间为[,) 。然而,不是一个线程只分配一个单位的任务,该线程的迁移任务做完了,整个大任务还没有分配完(>0),则还会继续分配,能者多劳 。
在一个[,)单位的任务做迁移时,从i=-1开始降序遍历,直到i--小于bound=说明这个单位的任务做完了,可以分配新的任务了 。当一个位置的节点都迁移完了,旧数组该位置会被fwd占位,同时置为true,表示可以向下一个位置迁移元素了,此时又来到上面的while (){},i--,开始新位置的元素迁移 。
【二ConcurrentHashMap源码深度解析(java8)——直呼Dou】当
- 中国5个最有特色的摩天轮第四个独一无二第五个世界最高 中国之最摩天轮
- 徐静雨:现役中库里排第二杜兰特只能排第三,这排名非常不严谨 徐静雨各个位置历史之最
- 火影忍者十大瞳术排行榜:轮墓·边狱只能排第二 世界十大瞳术
- 湖二师学子三下乡:素描画中国 中国之最简单画法
- 塞纳当选F1过去四十年最快车手!舒马赫、汉密尔顿分列二三 f1历史之最车手排位
- H5云商城源码全新UI|支持易支付v1.0【个人开发全网首发】
- 二 自动化测试 - RFT系列教程4: RFT是如何识别控件的 对象库与脚本
- 清朝十二帝:揭光绪帝和他的四个男人之谜
- 来涨姿势了,可能有用并使你才识渊博的冷知识来袭 二 跳远的吉尼斯记录
- 七十二景