Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么顺序流和并行流的缩减结果不同?_Java_Parallel Processing_Java 8_Java Stream - Fatal编程技术网

Java 为什么顺序流和并行流的缩减结果不同?

Java 为什么顺序流和并行流的缩减结果不同?,java,parallel-processing,java-8,java-stream,Java,Parallel Processing,Java 8,Java Stream,我有以下整数列表(所有数字从0到999999): 我期望得到以下结果: 0 - 0 = 0 1 + 0 = 1 2 - 1 = 1 3 + 1 = 4 4 - 4 = 0 5 + 0 = 5 6 - 5 = 1 7 + 1 = 8 8 - 8 = 0 ... 999,998 - 999,997 = 1 999,999 + 1 = 10,000,000 10000000(顺便说一句,有人能用数学来表达这个吗?我不能…) 如果我运行这个: int sum = i

我有以下整数列表(所有数字从0到999999):

我期望得到以下结果:

0 - 0 = 0  
1 + 0 = 1  
2 - 1 = 1   
3 + 1 = 4  
4 - 4 = 0  
5 + 0 = 5  
6 - 5 = 1  
7 + 1 = 8
8 - 8 = 0   
...
999,998 - 999,997 = 1
999,999 + 1 = 10,000,000
10000000
(顺便说一句,有人能用数学来表达这个吗?我不能…)

如果我运行这个:

int sum = integers.stream().reduce(
                0,
                (sum, i) -> i % 2 == 0 ? i - sum : i + sum
            );
sum
是预期金额,
10000000

但是,如果我将流更改为并行:

int sum = integers.parallelStream().reduce(
                0,
                (sum, i) -> i % 2 == 0 ? i - sum : i + sum
            );
sum
0


我似乎不明白为什么会这样,有人能解释一下吗?

Javadoc for
reduce

使用关联累积函数对该流的元素执行缩减

注意“联想”一词:这是你的约化函数不具备的属性

关联性是并行化的关键:操作的应用顺序没有定义,没有关联性,结果在重新排序下不会保持不变

如果您有两个以上可用的
处理器
,您可以使用以下代码来说服自己答案取决于子任务的数量(请注意,您不应该使用10_000_000作为问题大小,因为在分解过程中必须使用多个2;使用10_000_001):


更改系统属性的值时,结果也会更改。

我仍然感兴趣的是,为什么它总是0。
int sum = integers.stream().reduce(
                0,
                (sum, i) -> i % 2 == 0 ? i - sum : i + sum
            );
int sum = integers.parallelStream().reduce(
                0,
                (sum, i) -> i % 2 == 0 ? i - sum : i + sum
            );
System.setProperty("java.util.concurrent.ForkJoinPool.common.parallelism", "2");
System.out.println(IntStream.range(0,10_000_001).parallel().reduce(0,
    (sum, i) -> i % 2 == 0 ? i - sum : i + sum
));