并行流概念

时间:2015-09-10 22:34:35

标签: 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());

2 个答案:

答案 0 :(得分:5)

如果地图正在积极更新,您可能会在containsKeyget之间进行竞赛。相反,你可能会写一些类似

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

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

答案 1 :(得分:2)

映射是并发的,因此它可以处理多线程访问。无需同步或锁定。

在您的情况下,常规HashMap也会起作用,因为您只是在查询地图。只要没有人在流式传输时更新列表,就没有多线程争用。