首頁  >  文章  >  Java  >  項目 進行並行流時要小心

項目 進行並行流時要小心

王林
王林原創
2024-08-23 18:02:36403瀏覽

Item  Tenha cuidado ao fazer streams paralelas

Java 和競爭:

  • Java 始終處於促進並發程式設計的最前沿,自 1996 年以來提供本機執行緒支持,並不斷發展以包含 java.util.concurrent 和 fork-join 框架等函式庫。

流與並行性:

  • 隨著 Java 8 中流的引入,透過一次呼叫parallel() 方法就可以輕鬆並行化操作。然而,即使很容易,編寫正確且快速的並發程序仍然具有挑戰性。

效能與失敗:

  • 流管道的粗心並行化可能會導致效能和活動失敗(程式無法完成)。給出的範例表明,並行化流可能會導致 CPU 使用率顯著增加,但沒有明顯的結果。

啟發式與限制:

  • 如果用於分割工作的啟發式方法不合適,串流並行化可能會失敗,特別是在 Stream.iterate 和 limit 等操作中,計算額外元素的成本可能非常高。

理想的資料結構:
ArrayList、HashMap、HashSet、ConcurrentHashMap、陣列和範圍上的串流更適合併行化,因為可以輕鬆地在執行緒之間劃分工作並且具有良好的引用局部性。

終端操作:

  • 並行執行的有效性也取決於流的終端操作。歸約作業(例如reduce、min、max、count和sum)以及短路操作(例如anyMatch、allMatch和noneMatch)更適合併行性。

嚴格規格:

  • 平行管道中使用的函數必須是關聯的、互不干擾的和無狀態的。違反這些規則可能會導致不正確的結果或災難性的失敗。

執行訂單:

  • 並行化管道可能會使輸出變得混亂,並且可能需要像 forEachOrdered 這樣的操作來保持順序。

合理的平行性:

  • 只有在有充分理由的情況下才會並行化流。並行性不足可能會導致崩潰或效能不佳。始終在並行化之前和之後測量性能,以確保其有益。

效果範例:

  • 一個簡單的範例表明,並行化 π(n) 計算將執行時間從 31 秒減少到 9.2 秒,這表明並行性在某些場景下是高效的。

SplitableRandom 的使用:

  • 對於平行隨機數流,優先選擇 SplittableRandom 而不是 ThreadLocalRandom 或 Random,因為它是專門為此用途而設計的,並提供更好的性能。

結論:

  • 如果沒有充分的理由相信這樣做可以保持計算精度並提高速度,請勿嘗試並行化流管道。在將並行性應用於生產程式碼之前,執行嚴格的測試以驗證並行性是否合理。

範例
1.順序與順序流範例並行

  • 此範例示範了順序流和平行流之間的效能差異。 ParallelStreamExample.java

2。低效率使用parallel()的範例

  • 此範例展示了並行化如何導致意外行為。 InefficientParallelStream.java

3。高效率使用parallel()的範例

  • 這個例子展示了並行化實際上可以提高效能的情況。 高效率並行流,java

4。並行流的安全缺陷範例

  • 此範例示範了並行使用時,實作不當的歸約操作可能會失敗。 ParallelStreamSafetyExample.java

5。並行流的 SplittableRandom 範例

  • 此範例示範如何在平行流中使用 SplittableRandom 以獲得更好的效能。 SplittableRandomExample.java

這些範例有助於說明並行化的有用之處,也顯示了不加區別地使用 parallel() 的潛在風險。

以上是項目 進行並行流時要小心的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn