本文共 972 字,大约阅读时间需要 3 分钟。
在最近的开发过程中,遇到了一个需要注意的问题。在进行LinkedList遍历时,偶尔会出现空指针异常。这种问题的出现与使用ParallelStream向LinkedList中添加元素有关。需要注意的是,ParallelStream是并行流,而LinkedList和ArrayList都不是线程安全的,这可能导致并发修改引发的问题。
举个例子,以下代码运行几次后,偶尔会出现空指针异常:
public class TestLinkedList { public static void main(String[] args) { List list = new LinkedList(); List 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
这种问题的出现是因为ParallelStream的执行是按部就班的,并行操作可能导致意外的重复添加或其他并发问题。虽然LinkedList和ArrayList都不是线程安全的,但通过ParallelStream操作时,需要特别注意避免并发修改。建议在高并发场景下,可以考虑使用Collections.synchronizedList或其他线程安全的集合来替代。
转载地址:http://ntvfk.baihongyu.com/