博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java8的ParallelStream踩坑记录
阅读量:6214 次
发布时间:2019-06-21

本文共 555 字,大约阅读时间需要 1 分钟。

java8中的新特性stream流处理,让集合操作变得非常的简单,但是因为没有源码支持,所以里面有很多坑,只有踩过才知道

首先上代码

img_a8a29d4f98f4d91dc73381f261f7fb39.png
图1-1

代码很简单,就是利用并行流把一个list里面的数据导入到另外一个list中,看起来看简单,接下来我们看一下执行结果

img_04610a919da2bfd1f756247a332f25e1.png
图1-2

此处我们发现执行结果中,导入的list数据竟然少了一个??????,从代码上看貌似没啥问题啊???

多线程并发出现了这种问题,我们讲代码稍微修改一下,就可以

img_ada0bab790c0f489ffff4c31f04c097d.png
图1-3

执行结果

img_861853b326c673c1fcda83bd48dfd511.png
图1-4

我们来找一个出现问题的原因,此处,我们重复运行这段代码,,发现每次缺少的数字并不相同,而且缺少数字的个数也是一样,我们此处可以判断,在并行操作中,出现了线程安全问题,并行操作中,只有parallelStorage.add(e);的时候存在,我们把这个类修改成SynchronizedList类型的list,就可以解决这种问题,类似于图1-3中的解释

比较完整的解释:

Arraylist本身底层是一个数组,多线程并发下线程并不安全,操作出现的原因无非就是多个线程赋值可能同时操作同一个地址,后赋值的把先赋值的给覆盖掉了,才会出现这种问题。

附github地址:https://github.com/kevin0016/kevin-java-wallow

转载地址:http://ahdja.baihongyu.com/

你可能感兴趣的文章
“阿里云大数据技术实战训练营”江苏省大学生万人计划学术冬令营活动成功举行...
查看>>
新Kubeflow,新征程 (一):简化部署体验
查看>>
Kubernetes集群高可用的策略和实践
查看>>
Mybatis调用MySQL存储过程
查看>>
CSS(溢出_判断IE版本)
查看>>
阿里面试90%以上会问到的数据结构;HashMap
查看>>
Jdbc模板、事务管理
查看>>
hive 异常 (Attempt to do update or delete on table terminal that does not use an )
查看>>
其实,我是这么学习的
查看>>
对标华为 GPU Turbo,OPPO 推出 Hyper Boost 手机加速引擎
查看>>
行为识别论文笔记之多纤维网络 | ECCV 2018
查看>>
Java序列化 ObjectOutputStream源码解析
查看>>
web设计中那些因素可能影响网站后期优化
查看>>
第十八章:MVVM(三)
查看>>
SAP中使用Function Module创建物料的过程
查看>>
Building a Keras + deep learning REST API(三部曲之一)
查看>>
[算法总结] 十大排序算法
查看>>
Spring Aop之Cglib实现原理详解
查看>>
给定一个数组,找出不在数组中的最小的那个数字
查看>>
Java RequestDispatcher 详解
查看>>