为了账号安全,请及时绑定邮箱和手机立即绑定

使用 Java 8 并行流以原子方式更新从 Map 检索的元素

使用 Java 8 并行流以原子方式更新从 Map 检索的元素

暮色呼如 2021-06-08 13:38:12
我有一个并行流,其中我使用 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时才会阻塞。


查看完整回答
反对 回复 2021-06-10
  • 1 回答
  • 0 关注
  • 162 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信