java - 并行流概念

标签 java concurrency java-8 java-stream

我正在研究 Java 流,想知道这段代码是否有问题。由于我使用的是并行流,所以我使用了 ConcurrentHashMap。

class Person {
    private String name;

    public String getName() {
        return this.name;
    }
}

ConcurrentHashMap<Integer, Person> map = <Mapping of id to Person>
List<Integer> list = <list of Id>

list = list.parallelStream()
        .filter(id -> map.containsKey(id)
                      && !Strings.isNullOrEmpty(map.get(id).getName()))
        .collect(Collectors.toList());

最佳答案

如果 map 正在积极更新,您可能会在 containsKeyget 之间进行竞争。相反,你可能会写类似的东西

list.parallelStream()
    .filter(id -> {
       Person person = map.get(id);
       return person != null && !Strings.isNullOrEmpty(person.getName());
     })
    .collect(Collectors.toList());

使用 parallelStream 与此无关——没关系。它在同一键上对 ConcurrentMap 进行两次单独调用,并期望它们具有一致的结果,这就是问题所在。

关于java - 并行流概念,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32512680/

相关文章:

java - 使用java8将字符串转换为日期

java - java中ArrayList的对象的indexOf

c++ - 保护多线程访问的类实例

Java 8 : Get Operator-Function-Object with method reference

Java 并发 JDK 1.6 : Busy wait does better than signalling? Effective Java #51

Java:它创建的定时器和线程

scala - Scala 与 Java 8 中的折叠操作

java - 设置来自 Java 的 PostgreSQL JDBC 连接的连接选项

java - MIG 布局未显示正确的格式

java - 使用 appium whlie 客户端访问 Android 设置中的切换按钮是用 groovy 和 java 编写的