parallelStream遇到的坑

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。

你可能感兴趣的:(parallelStream遇到的坑)