Stream提供了parallel 方法,可以簡單的實現(xiàn)并行處理孙乖。但是想要真的利用stream 寫出出正確快速的實現(xiàn)直砂,還是有很多地方要注意的供璧。
安全問題:
當我們在使用stream 時,首先要保證的是安全問題汽煮,如果結(jié)果都執(zhí)行錯了搏熄,那代碼執(zhí)行的再快也沒有了意義。
安全性失敗可能是因為并行的pipeline使用了映射暇赤、過濾器或者程序員自己編寫的其他函數(shù)對象心例,并且沒有遵守它們的規(guī)范。當我們在使用stream 實現(xiàn)并行流時鞋囊,一定要確保后續(xù)的方法是互不干擾且無狀態(tài)的止后。否則在實際的運行過程中可能會因為資源競爭或互相影響狀態(tài),導致結(jié)果出錯溜腐。-
性能問題
- 1.引入并行流會引起額外的開銷,就像線程的頻繁上下文切換會導致額外的性能開銷一樣,當數(shù)據(jù)在多個cpu中的處理時間小于內(nèi)核之間的傳輸時間,使用并行流也就沒有什么意義了译株。
- 2.如果Stream是通過Iterator創(chuàng)建的,或者使用了中間操作的limit挺益,那么并行pipeline也不能提高性能
- 3.在Stream上通過并行獲得性能歉糜,最好是通過ArrayList、HashMap望众、HashSet和ConcurrentHashMap實例匪补,數(shù)組,int范圍和long范圍等烂翰。主要原因是夯缺,這些數(shù)據(jù)結(jié)構具有優(yōu)異的引用局部性,序列化的元素引用一起保存在內(nèi)存中甘耿。 他們能被輕松準確地切割成任意塊踊兜,更容易并行分工。具有最佳引用局部性的數(shù)據(jù)結(jié)構是基本類型數(shù)組棵里,因為數(shù)據(jù)是相鄰存儲于內(nèi)存的润文。
- 4.Stream pipeline的終止操作本質(zhì)上也影響了并發(fā)執(zhí)行的效率。在終止操作有大量依賴順序的操作時殿怜,并行效率就會大受影響典蝌。并行較好的終止操作有reduce、min头谜、max骏掀、count、sum、anyMatch截驮、allMatch和noneMatch笑陈。
Stream的parallel 方法使程序員可以更容易的寫出并行處理的代碼,但是在實現(xiàn)之前葵袭,必須要思考安全性并驗證性能是否真的有提升涵妥。
系統(tǒng)中我印象中最典型的應用,是新竹實現(xiàn)的一個多線程同步調(diào)用外部接口的功能坡锡,也在retro 時分享過蓬网,滿足線程見互不干擾且方法中無狀態(tài),并且確實能帶來性能上的顯著提升鹉勒。