parallelStream導致LinkedList遍歷時空指針的問題

       最近在開發中遇到一個問題,在遍歷一個LinkedList時偶然性的會發生空指針。前面兒是通過parrallelStream往這個LinkedList裏面添加元素,導致的這個問題,parrallelStream是並行流,而LinkedList和ArrayList都不是線程安全的,就可能會導致這個問題。

例如下面一段代碼,運行幾次,偶然就會出現空指針

       

public class TestLinkedList {

    public static void main(String[] args) {

        List<Integer> list = new LinkedList<>();
        List<Integer> list1 = new ArrayList<>();
        for(int j=0; j < 1000; j++){
            list1.add(j);
        }
        list1.parallelStream().forEach(t -> list.add(t));
        for (Integer integer : list) {
            System.out.println(integer);
        }
        System.out.println(list.size());
    }
}

 

  運行結果偶爾會出現空指針

Exception in thread "main" java.lang.NullPointerException
	at java.util.LinkedList$ListItr.next(LinkedList.java:893)
	at com.zhangmen.info.job.aop.TestLinkedList.main(TestLinkedList.java:23)

 解決辦法:將LinkedList和ArrayList變成線程安全的集合就沒問題了。

public class TestLinkedList {

    public static void main(String[] args) {

        List<Integer> list = Collections.synchronizedList(new LinkedList<>());
        List<Integer> list1 = new ArrayList<>();
        for(int j=0; j < 1000; j++){
            list1.add(j);
        }
        list1.parallelStream().forEach(t -> list.add(t));
        for (Integer integer : list) {
            System.out.println(integer);
        }
        System.out.println(list.size());
    }
}

  這樣可以解決併發時不安全的問題。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章