记一次ArrayList线程安全问题

现象

代码中有一段逻辑有时会没有执行完成就突然停止。

定位

查看报出的异常。查看异常信息发现有空指针。而往上追代码发现是因为业务逻辑中遍历某list时有元素为null。但是此业务逻辑中这个list的元素是不可能为null的。开始继续往里追找到构造此list相关的代码,发现以下代码:

List list = Lists.newArrayList();
Lists.partition(codeList, PAGE_SIZE_1000).parallelStream().forEach(partis -> {
   queryResultList(partis).forEach(result -> {
        //。。。
        list.add(result);
   });
});

(代码已简化)
恍然大悟,是因为线程不安全的ArrayList在parallelStream中并发执行add导致的。由于之前移植这块代码时候没有这块list.add逻辑,后来加的,但是没注意外层的parallelStream

总结

多线程下的业务逻辑要注意线程安全问题

你可能感兴趣的:(记一次ArrayList线程安全问题)