我这边做了一个实例来验证JAVA8多线程操作parallelStream()线程安全问题
List<Integer> integers = Lists.newArrayList();
for (int i = 0; i < 100; i++){
//插入100个数据
integers.add(i);
}
System.out.println(integers.parallelStream().count());
//多管道遍历
List<Integer> integerList = Lists.newArrayList();
integers.parallelStream().forEach(e -> {
//添加list的方法
integerList.add(e);
try {
//休眠100ms,假装执行某些任务
Thread.sleep(100);
} catch (InterruptedException e1) {
e1.printStackTrace();
}
});
System.out.println(integerList.parallelStream().count());//97
实例中建立两个数组集合,一个赋予100个数据,另一个为空,通过parallelStream()多线程遍历方法调用 integerList 的写功能,结果发现最后integerList 只是写入97条数据,丢失的三条数据被线程“吃“掉了,所以说这种并行流还是谨慎使用。
下面是我写的一个并行流对集合操作的一个解决办法,需要并行流操作的集合创建锁集合
List<Integer> integers = Lists.newArrayList();
for (int i = 0; i < 100; i++){
//插入100个数据
integers.add(i);
}
System.out.println(integers.parallelStream().count());
//多管道遍历 这边处理的时候创建锁集合
List<Integer> integerList = Collections.synchronizedList(new ArrayList<>());
integers.parallelStream().forEach(e -> {
//添加list的方法
//System.out.println("ThreadName:" + Thread.currentThread().getName());
integerList.add(e);
try {
//休眠100ms,假装执行某些任务
Thread.sleep(100);
} catch (InterruptedException e1) {
e1.printStackTrace();
}
});
System.out.println(integerList.parallelStream().count());//100
输出结果正确插入了100条数据
验证多线程输出: