java - 使用 Java 8 并行流更新从 Map 中自动检索的元素

标签 java multithreading java-8 hashmap java-stream

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

相关文章:

java - 如何在 Java 中生成指数分布数(给定均值)?

java-8 - 使用Java 8流修改列表中对象的属性值

c++ - 非阻塞线程安全堆栈

java - 使用 Lambda 时 Maven 插件构建失败

java - java 8 中函数和双函数的链接

java - 无状态 session bean 的 ejb 拦截器,如何调用有状态 session bean

java - 通过 JNA 检索数组

java - Maven 如何与不同的存储库交互?

python - 当子进程工作时做一些事情?

c++ - 使用者线程中的函数无法访问内存位置