示例分析
/** * 避坑 | Java8使用並行流(ParallelStream)注意事項 * * @author WH.L * @date 2020/12/26 17:14 */ public class TestParallelStream { public static void main(String[] args) { printFun(); } public static void printFun() { List<Integer> integersList = new ArrayList<>(); for (int i = 0; i < 100; i++) { integersList.add(i); } //普通集合 存儲 List<Integer> parallelStorage = new ArrayList<>(); //同步集合 存儲 List<Integer> parallelStorage2 = Collections.synchronizedList(new ArrayList<>()); //通過並行流存入普通集合parallelStorage中 integersList .parallelStream() .filter(i -> i % 2 == 0) .forEach(i -> parallelStorage.add(i)); System.out.println("開始打印普通集合parallelStorage"); parallelStorage .stream() .forEachOrdered(e -> System.out.print(e + " ")); System.out.println(); System.out.print("------------------------------------"); System.out.println(); //通過並行流存入同步集合parallelStorage2中 integersList .parallelStream() .filter(i -> i % 2 == 0) .forEach(i -> parallelStorage2.add(i)); System.out.println("開始打印同步集合parallelStorage"); parallelStorage2 .stream() .forEachOrdered(e -> System.out.print(e + " ")); } }
運行結果如下圖
問題與分析
1.為什么parallelStorage的數量不固定(正確的應該是50個)?
2.為什么parallelStorage會有null元素?
其實我們可以認為ArrayList內部維護了一個數組Arr其定義一個變量 n用以表式這個數組的大小那么向這個ArrayList中存儲數據的過程可以分解為這么幾步:
1.讀取數組的長度存入n
2.向這個數組中儲入元素arr[n]=a
3.將n+1
4.保存n
而對於parrallelStorage元素數量不固定的原因就是多線程有可能同時讀取到相同的下標n同時賦值,這樣就會出現元素缺失的問題了。
項目實戰
根據時間段拉取美團訂單時,我們先間隔20分鍾去分割時間,然后通過一個同步集合去存儲並行流中查詢回來的美團訂單。
好文
Collections.synchronizedList()方法實例
希望本文章對您有幫助,您的轉發、點贊是我的創作動力,十分感謝。
掃描下方二維碼關注我,您會收到更多優質文章推送。