ValueToString()
以上代码是我的代码的一小部分,用于显示问题。
我使用数字8的输入运行方法,但错误的答案如63,61,62并不总是64这是正确的答案。
如果我没有使用并行,它可以正常工作。 (顺便说一下,我使用parallel是因为输入很大:num可能是数百个)
为什么呢?
答案 0 :(得分:3)
问题是cnt[0]++;
是not an atomic operation,因此它不是线程安全的。
如果没有看到代码的其他部分,您可以改用AtomicInteger
并使用incrementAndGet()
。
但是,我强烈建议您重构代码,甚至可以放弃使用Streams。变异外部变量不是一种好的做法,应该避免使用。
答案 1 :(得分:0)
对数组cnt的访问不同步,因此++操作可能会重叠。因此他们中的一些人相互抵消了。
尝试为每次迭代使用单独的索引,或者使用AtomicInteger类型的同步变量。