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)
如果地图正在积极更新,您可能会在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对同一个键进行两次单独调用,并期望它们具有一致的结果,这就是问题所在.
| 归档时间: |
|
| 查看次数: |
139 次 |
| 最近记录: |