避坑 | Java8使用並行流(ParallelStream)注意事項


示例分析

/**
 * 避坑 | 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()方法實例

希望本文章對您有幫助,您的轉發、點贊是我的創作動力,十分感謝。

掃描下方二維碼關注我,您會收到更多優質文章推送。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM