JAVA使用并行流(ParallelStream)时要注意的一些问题
来源:互联网 发布:人人商城2.0 源码下载 编辑:程序博客网 时间:2024/06/07 04:44
public static void main(String[] args) throws InterruptedException { Integer[] intArray = {1, 2, 3, 4, 5, 6, 7, 8}; List<Integer> listOfIntegers = new ArrayList<>(Arrays.asList(intArray)); List<Integer> parallelStorage = new ArrayList<>();//Collections.synchronizedList(new ArrayList<>()); listOfIntegers .parallelStream() // Don't do this! It uses a stateful lambda expression. .map(e -> { parallelStorage.add(e); return e; }) .forEachOrdered(e -> System.out.print(e + " ")); System.out.println(); parallelStorage .stream() .forEachOrdered(e -> System.out.print(e + " ")); System.out.println(); System.out.println("Sleep 5 sec"); TimeUnit.SECONDS.sleep(5); parallelStorage .stream() .forEachOrdered(e -> System.out.print(e + " "));}
运行以上代码你可能会得到以下几种结果:
Result 1:1 2 3 4 5 6 7 8 null 3 8 7 1 4 5 6 Sleep 5 secnull 3 8 7 1 4 5 6Result 2:1 2 3 4 5 6 7 8 6 2 4 1 5 7 8 Sleep 5 sec6 2 4 1 5 7 8
两个问题:
1.为什么parallelStorage的大小不固定?
2.为什么parallelStorage会有null元素?
最初我以为是因为主线程执行完成后并行流中的线程并未结束,sleep了主线程后发现结果并没有发生改变,其实我们可以认为ArrayList内部维护了一个数组Arr其定义一个变量 n用以表式这个数组的大小那么向这个ArrayList中存储数据的过程可以分解为这么几步:
1.读取数组的长度存入n
2.向这个数组中储入元素arr[n]=a
3.将n+1
4.保存n
A.对于元素中有null值的情况:
考虑三个线程的关系
如果是这种情况就会出现null元素;
B.而对于parrallelStorage元素数量不固定的原因就是多线程有可能同时读取到相同的下标n同时赋值,这样就会出现元素缺失的问题了
如何解决这个问题呢?我们可以将其转化为一个同步集合也就是
Collections.synchronizedList(new ArrayList<>())
但是要注意的是,在使用并行流的时候是无法保证元素的顺序的,也就是即使你用了同步集合也只能保证元素都正确但无法保证其中的顺序,这个在Oracle官方文档也有说明,不要使用有副作用的lambda表达式,那么什么是有副作用的lambda表达式呢?
官方文档说“ A stateful lambda expression is one whose result depends on any state that might change during the execution of a pipeline.”就是说这种lambda表达式的结果会在管道执行的过程中发生变化
阅读全文
7 0
- JAVA使用并行流(ParallelStream)时要注意的一些问题
- 并行流parallelStream
- 【Java没基础】Java 8 并行流 ParallelStream
- 学会使用java8的parallelStream
- 使用Xib要注意的一些问题
- 使用数组时注意的一些问题
- 使用Entity Framework时要注意的一些性能问题
- Java程序员面试时要注意的一些问题
- Java程序员面试时要注意的一些问题
- 使用 Java HashSet 时要注意的一些地方
- JDK8的ParallelStream遍历无序的问题
- Java8新特性——并行流parallelStream
- java实际开发中泛型使用需要注意的一些问题
- 使用cmd运行java注意的一些问题
- Oracle使用并行建索引需要注意的问题
- 面试时要注意的一些问题
- 面试时要注意的一些问题
- 面试时要注意的一些问题
- 期末编程考试小结
- MOOC清华《程序设计基础》第1章第5题:银行存款问题
- 拓展欧几里得算法详解
- Java从入门到精通Chapter7_4温度转换
- Windows配置SQLite
- JAVA使用并行流(ParallelStream)时要注意的一些问题
- Java从入门到精通Chapter7_5
- Android_省和市的二级联动
- 第四届“图灵杯”NEUQ-ACM程序设计竞赛(团队赛)-网络同步赛C(大数斐波那契数)
- Integer比较需用equal不用‘==’
- 第四届“图灵杯”NEUQ-ACM程序设计竞赛 E: 简单的RMQ【线段树】
- CSS Sticky Footer: 完美的CSS绝对底部
- web.xml中load-on-startup的作用
- C/C++的预处理指令详解