java 8 parallelStream()多管道的使用初试牛刀
- parallelStream()也有人叫它并行流,都是同样的概念,多线程。
- 既然是多线程,那么它一定有线程安全问题,那么要怎么控制呢?废话少说,一起来看下吧!
- 背景:遍历集合时候使用parallelStream()会比stream()快很多,但是我们写个demo,你就会发现,数据丢失了。。。
//创建集合大小为100
List<Integer> integers = Lists.newArrayList();
for (int i = 0; i < 100; i++){
integers.add(i);
}
//多管道遍历
List<Integer> integerList = Lists.newArrayList();
integers.parallelStream().forEach(e -> {
//添加list的方法
setInteger(integerList, e);
try {
//休眠100ms,假装执行某些任务
Thread.sleep(100);
} catch (InterruptedException e1) {
e1.printStackTrace();
}
});
private static void setInteger(List<Integer> integerList, Integer e) {
integerList.add(e);
}
- 以上代码你会发现,执行完了integerList的大小和预期的不一样,这是为什么呢?个人理解就是没有锁造成的,很简单,在setInteger()方法上加个修饰synchronized就ok了
// 加synchronized修饰的方法是线程安全的,某一线程在执行这个方法的时候,其他线程只能眼巴巴看着;
private static synchronized void setInteger(List<Integer> integerList, Integer e) {
integerList.add(e);
}