【发布时间】:2020-07-29 18:41:38
【问题描述】:
这个answer 提供了一个分割 IntStream 的实现:
IntStream intStream = IntStream.iterate(0, i -> i + 1).limit(1000000);
Predicate<Integer> p = x -> r.nextBoolean();
Map<Boolean, List<Integer>> groups = intStream.collect(() -> {
Map<Boolean, List<Integer>> map = new HashMap<>();
map.put(false, new ArrayList<>());
map.put(true, new ArrayList<>());
return map;
}, (map, x) -> {
boolean partition = p.test(x);
List<Integer> list = map.get(partition);
list.add(x);
}, (map1, map2) -> {
map1.get(false).addAll(map2.get(false));
map1.get(true).addAll(map2.get(true));
});
System.out.println(groups.get(false).size());
System.out.println(groups.get(true).size());
但它的编辑提到这个实现不是线程安全的。然而,据我所知,收集器为并行流中的每个线程创建一个单独的HashMap<List<Integer>>。所以每个地图都被限制在一个线程中。分区功能也仅限于单个线程。合并函数合并来自多个线程的结果,但据我所知,流框架确保合并以线程安全的方式完成。所以我的问题是:这个解决方案真的不是线程安全的吗?
顺便说一句:无论如何,答案提供了一个更优雅的解决方案(Stream<Integer> stream = intStream.boxed(); 等),但我仍然想知道。
PS:我想将此问题作为评论添加到原始帖子中,但我什至没有添加 cmets 的声誉...:|
【问题讨论】:
-
链接的答案已更正。
标签: java multithreading concurrency java-stream