Java8的ParallelStream踩坑记录

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

首先上代码

图1-1

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

图1-2

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

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

图1-3

执行结果

图1-4

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

比较完整的解释:

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


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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容