最近在開發中遇到一個問題,在遍歷一個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());
}
}
這樣可以解決併發時不安全的問題。