并行流概念

use*_*576 4 java concurrency java-8 java-stream

我正在探索Java流,并想知道这段代码是否有任何问题.由于我使用并行流,我使用了ConcurrentHashMap.

class Person {
    private String name;

    public String getName() {
        return this.name;
    }
}
Run Code Online (Sandbox Code Playgroud)

和

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());
Run Code Online (Sandbox Code Playgroud)

Lou*_*man 5

如果地图正在积极更新,您可能会在containsKey和之间进行比赛get.相反,你可能会写一些类似的东西

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

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