shm*_*sel 5 java parallel-processing synchronization java-stream
该包的摘要的java.util.stream规定如下:
有状态 lambda 的一个例子是
map()in的参数:Run Code Online (Sandbox Code Playgroud)Set<Integer> seen = Collections.synchronizedSet(new HashSet<>()); stream.parallel().map(e -> { if (seen.add(e)) return 0; else return e; })...在这里,如果映射操作是并行执行的,由于线程调度差异,相同输入的结果可能会因运行而异,而对于无状态 lambda 表达式,结果将始终相同。
我不明白为什么这不会产生一致的结果,因为该集合是同步的并且一次只能处理一个元素。您能否以一种演示结果如何因并行化而变化的方式完成上述示例?
List<Integer> numbers = // fill it in with [1, 3, 3, 5]
List<Integer> collected = numbers.stream().parallel().map(...).collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)
collected 可以包含 [0, 0, 3, 0] 或 [0, 3, 0, 0],具体取决于首先处理中间两个元素中的哪一个。
| 归档时间: |
|
| 查看次数: |
247 次 |
| 最近记录: |