java - 使用 fork/join 进行 Java 并发修改
问题描述
在为我的 fork/join 构建计算功能时,我使用 fork/join 得到了错误并发修改。我知道这与您正在循环的结构的并发修改有关。但是,我在我的代码中看不到这种情况(hmap 是这里的常规哈希图作为类变量):
public void compute() {
if (left < right) {
int mid = (left + right) / 2;
CHTcounter leftSort = new CHTcounter(array, left, mid,hmap);
CHTcounter rightSort = new CHTcounter(array, mid + 1, right,hmap);
leftSort.fork();
rightSort.compute();
leftSort.join();
leftSort.hmap.entrySet()
.forEach(entry -> rightSort.hmap.merge(
entry.getKey(),
entry.getValue(),
(key, value) -> entry.getValue() + value));
hmap = rightSort.hmap;
}else{
array[left].getUsers().forEach((el) -> {
hmap.put(el,1);
});
}
}
该错误与 if 代码块中的 for each 有关,但据我了解,我没有更改循环的数据结构。有人可以帮我理解为什么这仍然是并发修改吗?
解决方案
推荐阅读
- webpack - 如何调试 prestashop 捆绑的 js 文件
- kubernetes - 无法识别“https://raw.githubusercontent.com/coreos/flannel/master/Documentation/k8s-manifests/kube-flannel-rbac.yml”:没有匹配
- javascript - React 子组件仅在刷新时更新
- linux - 无法从 linux 64 位交叉编译到 linux 32
- android - Kalc 如何在 TextView 旁边显示项目列表?
- virtual-machine - 如何在 KVM 虚拟机中提取新创建的文件?
- ruby-on-rails - 在 Heroku 中部署 rails App 时无法检测到 rake 任务
- nginx - nginx grpc_pass 仅适用于 root
- c++ - 为什么具有不同调用约定的函数仍然可以相互调用?
- c# - 在类中为 C# 中的 linq 查询创建一个匿名对象