首頁> Java> java教程> 主體

項目 進行並行流時要小心

王林
發布: 2024-08-23 18:02:36
原創
289 人瀏覽過

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中文網其他相關文章!

來源:dev.to
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!