現(xiàn)象
代碼中有一段邏輯有時(shí)會(huì)沒(méi)有執(zhí)行完成就突然停止恳谎。
定位
查看報(bào)出的異常。查看異常信息發(fā)現(xiàn)有空指針楔脯。而往上追代碼發(fā)現(xiàn)是因?yàn)闃I(yè)務(wù)邏輯中遍歷某list時(shí)有元素為null喇肋。但是此業(yè)務(wù)邏輯中這個(gè)list的元素是不可能為null的。開(kāi)始繼續(xù)往里追找到構(gòu)造此list相關(guān)的代碼档桃,發(fā)現(xiàn)以下代碼:
List<String> list = Lists.newArrayList();
Lists.partition(codeList, PAGE_SIZE_1000).parallelStream().forEach(partis -> {
queryResultList(partis).forEach(result -> {
//枪孩。。藻肄。
list.add(result);
});
});
(代碼已簡(jiǎn)化)
恍然大悟蔑舞,是因?yàn)榫€程不安全的ArrayList在parallelStream中并發(fā)執(zhí)行add導(dǎo)致的。由于之前移植這塊代碼時(shí)候沒(méi)有這塊list.add邏輯嘹屯,后來(lái)加的攻询,但是沒(méi)注意外層的parallelStream
總結(jié)
多線程下的業(yè)務(wù)邏輯要注意線程安全問(wèn)題