IntStream.range()上的forEach并行给出了错误的答案

时间:2015-12-06 18:19:03

标签: java parallel-processing java-stream

ValueToString()

以上代码是我的代码的一小部分,用于显示问题。

我使用数字8的输入运行方法,但错误的答案如63,61,62并不总是64这是正确的答案。

如果我没有使用并行,它可以正常工作。 (顺便说一下,我使用parallel是因为输入很大:num可能是数百个)

为什么呢?

2 个答案:

答案 0 :(得分:3)

问题是cnt[0]++;not an atomic operation,因此它不是线程安全的。

如果没有看到代码的其他部分,您可以改用AtomicInteger并使用incrementAndGet()

但是,我强烈建议您重构代码,甚至可以放弃使用Streams。变异外部变量不是一种好的做法,应该避免使用。

答案 1 :(得分:0)

对数组cnt的访问不同步,因此++操作可能会重叠。因此他们中的一些人相互抵消了。

尝试为每次迭代使用单独的索引,或者使用AtomicInteger类型的同步变量。