java8的ParallelStream踩坑记录

简介: java8中的新特性stream流处理,让集合操作变得非常的简单,但是因为没有源码支持,所以里面有很多坑,只有踩过才知道首先上代码图1-1代码很简单,就是利用并行流把一个list里面的数据导入到另外一个list中,看起来看简单,接下来...

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

相关文章
|
Java
java8中修改parallelStream默认并发数
java8中修改parallelStream默认并发数
1573 0
java8中修改parallelStream默认并发数
|
3月前
|
Java
Java并行流问题之parallelStream的使用方式
Java并行流问题之parallelStream的使用方式
63 1
|
4月前
|
Java 数据处理
Java8的新特性parallelStream()的概念、对比线程优势与实战
parallelStream() 是 Java 8 中新增的一个方法,它是 Stream 类的一种扩展,提供了将集合数据并行处理的能力。普通的 stream() 方法是使用单线程对集合数据进行顺序处理,而 parallelStream() 方法则可以将集合数据分成多个小块,分配到多个线程并行处理,从而提高程序的执行效率。
428 3
|
11月前
|
安全 Java
Java8中的Stream()与ParallelStream()的区别
Java8中的Stream()与ParallelStream()的区别
64 0
|
并行计算 算法 安全
谨慎使用 Java8 新特性 ParallelStream并行流
谨慎使用 Java8 新特性 ParallelStream并行流
983 0
|
安全 Java
使用Java8新特性parallelStream遇到的坑
使用Java8新特性parallelStream遇到的坑
|
前端开发 安全 Java
面试官:java8中parallelStream提升数倍查询效率是怎样实现的
业务场景 在很多项目中,都有类似数据汇总的业务场景,查询今日注册会员数,在线会员数,订单总金额,支出总金额等。。。这些业务通常都不是存在同一张表中,我们需要依次查询出来然后封装成所需要的对象返回给前端。那么在此过程中,就可以把这个接口中“大任务”拆分成N个小任务,异步执行这些小任务,等到最后一个小任务执行完,把所有任务的执行结果封装到返回结果中,统一返回到前端展示。
面试官:java8中parallelStream提升数倍查询效率是怎样实现的
|
7天前
|
存储 缓存 安全
【Java面试题汇总】多线程、JUC、锁篇(2023版)
线程和进程的区别、CAS的ABA问题、AQS、哪些地方使用了CAS、怎么保证线程安全、线程同步方式、synchronized的用法及原理、Lock、volatile、线程的六个状态、ThreadLocal、线程通信方式、创建方式、两种创建线程池的方法、线程池设置合适的线程数、线程安全的集合?ConcurrentHashMap、JUC
【Java面试题汇总】多线程、JUC、锁篇(2023版)
|
17天前
|
监控 Java 调度
【Java学习】多线程&JUC万字超详解
本文详细介绍了多线程的概念和三种实现方式,还有一些常见的成员方法,CPU的调动方式,多线程的生命周期,还有线程安全问题,锁和死锁的概念,以及等待唤醒机制,阻塞队列,多线程的六种状态,线程池等
79 6
【Java学习】多线程&JUC万字超详解
|
3天前
|
Java
深入理解Java中的多线程编程
本文将探讨Java多线程编程的核心概念和技术,包括线程的创建与管理、同步机制以及并发工具类的应用。我们将通过实例分析,帮助读者更好地理解和应用Java多线程编程,提高程序的性能和响应能力。
15 4