我想計算a^b,例如, 2^30,當計算a^b爲什麼並行不行,但parallelStream可能
public long pow(final int a, final int b)
第一我用這種方式
return LongStream.range(0, b).reduce(1, (acc, x) -> a * acc); // 1073741824
得到正確的結果。然後我想並行計算的話,自然就會去把它改成
return LongStream.range(0, b).parallel().reduce(1, (acc, x) -> a * acc); // 32
但在這種情況下,結果就是32
。爲什麼?因此,對於支持並行
我在這種情況下,它的工作原理再次
return Collections.nCopies(b,a).parallelStream().reduce(1, (acc, x) -> acc * x); // 1073741824
改變了它。
那麼parallel
的方式有什麼問題?
我仍然困惑,如果它不聯想爲什麼第一種方式 - 沒有平行 - 它的作品?我甚至試圖模擬這個結果--32,我不能再現它。我的代碼是https://gist.github.com/zhugw/248f2942ce955877a18a2f3f4fa4c68e我認爲這種方式是通過並行實現的。 – zhuguowei
它恰好工作,因爲當前的順序執行**發生**實際上不取決於2個要求(關聯和身份)中的任何一個。並行實現取決於兩者。但是不能保證你的第一個樣品將繼續工作。 Java標準庫或甚至未來版本的JDK的替代實現可能會以破壞它的方式實現。 – Misha
你好,我有一些新的發現。請參閱下面的答案。 – zhuguowei