序言
Java8的各种流操作确实大大简化了工作量,并且对代码也起到了优化作用,本次记录昨天使用parallelStream的坑。
1、遍历集合时修改本集合的长度
这是一个低级的坑,自从昨天踩了这个坑,我觉得还是有必要对基础知识多巩固一下了。遍历集合时对集合进行增加和删除都很容易产生数组越界异常等情况,谨慎操作。
操作可参考《阿里巴巴Java开发手册》
2、add或addAll添加数据
问题场景:假设遍历集合A,满足某条件数据插入集合B。集合B出现了数据越界异常java.lang.ArrayIndexOutOfBoundsException
,具体原因看控制台错误还是很明显的,具体原因可参考博客记一次java8 parallelStream使用不当引发的血案。
这篇博客分析的原因还是很透彻的,不过解决办法就说不使用parallelStream就能解决这个问题了,但这好像治标不治本。
个人理解的两种解决方式:
- 采用指定集合
初始化大小
的方式解决:既然是因为集合扩容产生的问题,那么我们就解决掉扩容问题不就可以了,可以在创建集合的时候根据预估大小来指定集合大小(如果不能估计到大小,请采用下面的方式); - 不在遍历中去将满足条件的数据添加进B集合:可以采用Java8的
filter
方法筛选出满足条件的集合再去进行其他操作。3、使用parallelStream,Spring事务不回滚
spring事务上下文通过ThreadLocal维护。
parallelStream并发执行,除了主线程,其他线程不在事务上下文中,导致spring事务失效。
解决办法
1、parallelStream不做事务操作
2、parallelStream换成stream串行流
- 本文作者: tenyears
- 本文链接: https://tenyears94.gitee.io/2020/10/22/记录一次使用parallelStream的坑/
- 版权声明: 本博客所有文章转载请注明出处!