Java
parallelStream遇到的坑
线程安全问题
paralleStream
是并行流,并行就意味着是多线程,多线程就会遇到线程安全的问题。
list.parallelStream()
.filter(c ->c.getParentId().equals(id))
.forEach(c -> {
if(!c.getHasProduct() && allRelationMap.get(c.getId())!=null) {
c.setProductId(allRelationMap.get(c.getId()).getProductId());
}
resultList.add(c);
});
我在对List的forEach中对数据进行操作时,resultList里面的指经常会出现为NULL
的情况,最终发现是由于ArrayList是线程不安全的导致的。
最终的解决方案是:resultList =new CopyOnWriteArrayList<>();
CopyOnWriteArrayList是线程安全的,也可以使用resultList = Collections.synchronizedList(Arrays.asList());
当然其实最好的解决办法其实是在使用paralleStream
时不使用foreach、map。