parallelStream中HashSet的线程安全
Thread safety of HashSet in parallelStream
在并行流的谓词函数中有效地使用 final HashSet
是否安全?
如果不是,使用什么数据结构比较好?我没有看到 ConcurrentSet
...我想我可以使用 ConcurrentHashMap.entrySet()
.
据我所知,即使未修改 HashSet,最新状态也可能并非在所有线程中都可用。但也许有一个简单的技巧可以让它可用?
List<Integer> items = Stream
.of(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
.collect(Collectors.toList());
Set<Integer> exclude = Stream
.of(5, 10, 15)
.collect(Collectors.toSet());
List<Integer> filtered = items
.parallelStream()
.filter(num -> !exclude.contains(num))
.collect(Collectors.toList());
只要您不在并行线程中修改集合,按照您的示例描述的方式使用应该是绝对安全的。
在并行流的谓词函数中有效地使用 final HashSet
是否安全?
如果不是,使用什么数据结构比较好?我没有看到 ConcurrentSet
...我想我可以使用 ConcurrentHashMap.entrySet()
.
据我所知,即使未修改 HashSet,最新状态也可能并非在所有线程中都可用。但也许有一个简单的技巧可以让它可用?
List<Integer> items = Stream
.of(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
.collect(Collectors.toList());
Set<Integer> exclude = Stream
.of(5, 10, 15)
.collect(Collectors.toSet());
List<Integer> filtered = items
.parallelStream()
.filter(num -> !exclude.contains(num))
.collect(Collectors.toList());
只要您不在并行线程中修改集合,按照您的示例描述的方式使用应该是绝对安全的。