我有一个并行流,我在其中使用 Map 来改变元素。
Map<Long, List<MyItem>> hashmap = foo.getMap();
itemStream.parallel()
.filter(Objects::nonNull)
.forEach(item -> setProperties(hashmap, item));
“setProperties()”方法获取 map 和项目,并使用项目执行获取,然后设置项目的一些属性。
我想要的是自动完成获取/属性设置。这样两个线程就不能对同一个键执行获取操作,并且可以交错进行属性更新。
private void setProperties(Map<Long, List<Item>> map, Item item) {
long id = item.getID();
List<Object1> items = map.get(id);
for (Object1 ob : items) {
ob.setId(item.getFloorId());
ob.setPath(item.getPath());
ob.setTypeName(item.getTypeName());
}
}
还有一点担心延迟问题以及这种并行化与现有的单线程方法相比是否真的有好处。
最佳答案
同步 map 或从中获取数据没有任何好处,因为 map 未被更改,因此不存在竞争条件。
您需要同步更新,以便它们同时发生:
for (Object1 ob : items) {
synchronized (ob) {
ob.setId(item.getFloorId());
ob.setPath(item.getPath());
ob.setTypeName(item.getTypeName());
}
}
这对性能的影响非常小,因为如今同步引入的开销非常小,并且只有在操作相同的 Item 时才会阻塞。
关于java - 使用 Java 8 并行流更新从 Map 中自动检索的元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51501464/