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

我有一个并行流,其中我使用 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());

    }

}

也有点担心延迟命中以及这种并行化是否真的比现有的单线程方法有好处。


暮色呼如
浏览 163回答 1
1回答

皈依舞

同步地图或从中获取没有任何好处,因为地图没有被改变,所以没有竞争条件。您需要同步更新,以便它们一次性发生:for (Object1 ob : items) {&nbsp; &nbsp; synchronized (ob) {&nbsp; &nbsp; &nbsp; &nbsp; ob.setId(item.getFloorId());&nbsp; &nbsp; &nbsp; &nbsp; ob.setPath(item.getPath());&nbsp; &nbsp; &nbsp; &nbsp; ob.setTypeName(item.getTypeName());&nbsp; &nbsp; }}这对性能的影响很小,因为现在同步引入的开销非常小,并且只有在操作相同的Item时才会阻塞。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java