在做项目时,同事遇到的java8问题总结
问题:使用parallelStream并行流,每次请求list数据集合变化
private static void isParallelStream(){
List<Integer> list = new ArrayList<>();
for (int i = 0; i <99 ; i++) {
list.add(i);
}
List<Integer> list2 = new ArrayList<>();
list.parallelStream().forEach(e->
list2.add(e)
);
log.error("list:{},list2:{}",list.size(), list2.size());
}
parallelStream是并行流,当使用时会出来list2中add值的变化,是因为ArrayList是线程不安全问题;
解决方法:
1、将parallelStream换成stream()或者直接使用list.forEach,是一样的效果;
2、使用map转成新对象,然后再转成list
private static void isParallelStream(){
List<Integer> list = new ArrayList<>();
for (int i = 0; i <99 ; i++) {
list.add(i);
}
List<Integer> list2 = new ArrayList<>();
list2 = list.parallelStream().map(a -> {
return a;
}).collect(Collectors.toList());
// .forEach(e->
// list2.add(e)
// );
log.error("list:{},list2:{}",list.size(), list2.size());
}