1.1 目标
解决parallelStream线程安全问题


运行效果:

我们明明是往集合中添加1000个元素,而实际上只有903个元素。
解决方法: 加锁、使用线程安全的集合或者调用Stream的 toArray() / collect() 操作就是满足线程安全的了。
// parallelStream线程安全问题@Testpublic void parallelStreamNotice() {ArrayList<Integer> list = new ArrayList<>();/*IntStream.rangeClosed(1, 1000).parallel().forEach(i -> {list.add(i);});System.out.println("list = " + list.size());*/// 解决parallelStream线程安全问题方案一: 使用同步代码块/*Object obj = new Object();IntStream.rangeClosed(1, 1000).parallel().forEach(i -> {synchronized (obj) {list.add(i);}});*/// 解决parallelStream线程安全问题方案二: 使用线程安全的集合// Vector<Integer> v = new Vector();/*List<Integer> synchronizedList = Collections.synchronizedList(list);IntStream.rangeClosed(1, 1000).parallel().forEach(i -> {synchronizedList.add(i);});System.out.println("list = " + synchronizedList.size());*/// 解决parallelStream线程安全问题方案三: 调用Stream流的collect/toArrayList<Integer> collect = IntStream.rangeClosed(1, 1000).parallel().boxed().collect(Collectors.toList());System.out.println("collect.size = " + collect.size());}
