我有一个并行流,其中我使用 Map 来改变元素。Map<Long, List<MyItem>> hashmap = foo.getMap();itemStream.parallel() .filter(Objects::nonNull) .forEach(item -> setProperties(hashmap, item));方法“setProperties()”获取地图和项目,并使用项目执行获取,然后设置项目的一些属性。我想要的是以原子方式完成获取/属性设置。这样两个线程就不能对同一个键执行 get 并且属性更新是交错的。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()); }}也有点担心延迟命中以及这种并行化是否真的比现有的单线程方法有好处。
1 回答
皈依舞
TA贡献1851条经验 获得超3个赞
同步地图或从中获取没有任何好处,因为地图没有被改变,所以没有竞争条件。
您需要同步更新,以便它们一次性发生:
for (Object1 ob : items) {
synchronized (ob) {
ob.setId(item.getFloorId());
ob.setPath(item.getPath());
ob.setTypeName(item.getTypeName());
}
}
这对性能的影响很小,因为现在同步引入的开销非常小,并且只有在操作相同的Item时才会阻塞。
添加回答
举报
0/150
提交
取消