并行流概念
Parallel Streams concept
我正在探索 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());
地图是并发的,所以它可以处理多线程访问。无需同步或锁定。
对于您的情况,常规 HashMap
也可以,因为您只是在查询地图。只要在流式传输时没有人更新列表,您就没有多线程争用。
如果地图正在积极更新,您可能会在 containsKey
和 get
之间进行比赛。相反,您可能会写类似
list.parallelStream()
.filter(id -> {
Person person = map.get(id);
return person != null && !Strings.isNullOrEmpty(person.getName());
})
.collect(Collectors.toList());
使用 parallelStream
与此无关——没关系。它在同一个键上对 ConcurrentMap
进行了两次单独的调用,并期望它们具有一致的结果,这就是问题所在。
我正在探索 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());
地图是并发的,所以它可以处理多线程访问。无需同步或锁定。
对于您的情况,常规 HashMap
也可以,因为您只是在查询地图。只要在流式传输时没有人更新列表,您就没有多线程争用。
如果地图正在积极更新,您可能会在 containsKey
和 get
之间进行比赛。相反,您可能会写类似
list.parallelStream()
.filter(id -> {
Person person = map.get(id);
return person != null && !Strings.isNullOrEmpty(person.getName());
})
.collect(Collectors.toList());
使用 parallelStream
与此无关——没关系。它在同一个键上对 ConcurrentMap
进行了两次单独的调用,并期望它们具有一致的结果,这就是问题所在。