现象
代码中有一段逻辑有时会没有执行完成就突然停止。
定位
查看报出的异常。查看异常信息发现有空指针。而往上追代码发现是因为业务逻辑中遍历某list时有元素为null。但是此业务逻辑中这个list的元素是不可能为null的。开始继续往里追找到构造此list相关的代码,发现以下代码:
List<String> 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
总结
多线程下的业务逻辑要注意线程安全问题