示例分析

/**
* 避坑 | Java8使用并行流(ParallelStream)注意事项
*
* @author WH.L
* @date 2020/12/26 17:14
*/
public class TestParallelStream {
public static void main(String[] args) {
printFun();
}
public static void printFun() {
List<Integer> integersList = new ArrayList<>();
for (int i = 0; i < 100; i++) {
integersList.add(i);
}
//普通集合 存储
List<Integer> parallelStorage = new ArrayList<>();
//同步集合 存储
List<Integer> parallelStorage2 = Collections.synchronizedList(new ArrayList<>());
//通过并行流存入普通集合parallelStorage中
integersList
.parallelStream()
.filter(i -> i % 2 == 0)
.forEach(i -> parallelStorage.add(i));
System.out.println("开始打印普通集合parallelStorage");
parallelStorage
.stream()
.forEachOrdered(e -> System.out.print(e + " "));
System.out.println();
System.out.print("------------------------------------");
System.out.println();
//通过并行流存入同步集合parallelStorage2中
integersList
.parallelStream()
.filter(i -> i % 2 == 0)
.forEach(i -> parallelStorage2.add(i));
System.out.println("开始打印同步集合parallelStorage");
parallelStorage2
.stream()
.forEachOrdered(e -> System.out.print(e + " "));
}
}

运行结果如下图

问题与分析

1.为什么parallelStorage的数量不固定(正确的应该是50个)?

2.为什么parallelStorage会有null元素?

其实我们可以认为ArrayList内部维护了一个数组Arr其定义一个变量 n用以表式这个数组的大小那么向这个ArrayList中存储数据的过程可以分解为这么几步:

1.读取数组的长度存入n

2.向这个数组中储入元素arr[n]=a

3.将n+1

4.保存n

而对于parrallelStorage元素数量不固定的原因就是多线程有可能同时读取到相同的下标n同时赋值,这样就会出现元素缺失的问题了。

项目实战

根据时间段拉取美团订单时,我们先间隔20分钟去分割时间,然后通过一个同步集合去存储并行流中查询回来的美团订单。

好文

Collections.synchronizedList()方法实例

希望本文章对您有帮助,您的转发、点赞是我的创作动力,十分感谢。

扫描下方二维码关注我,您会收到更多优质文章推送。

最新文章

  1. java compiler level does not match the version of the installed java project facet 解决方案
  2. Arcgis SDE10.1 和 Arcgis server10.1的授权文件license
  3. Android Studio新建了一个项目提示Error:Unable to start the daemon process
  4. 使用Architecture Explorer分析应用程序及使用层次图
  5. Expectation maximization - EM算法学习总结
  6. 在同一上机器上建立两个SVN服务
  7. 利用CSS3选择器定制checkbox和radio
  8. 射频识别技术漫谈(29)——射频接口芯片TRF7960
  9. 解析汽车B2C商城网站四种盈利模式
  10. Laravel的console使用方法
  11. 增强遍历和Object多参数遍历
  12. [LeetCode] Set Intersection Size At Least Two 设置交集大小至少为2
  13. 【matlab编程】matlab随机数函数
  14. JavaScript正则表达式基础
  15. 【shell实例】定时21:00-21:05,循环调用DSQL脚本,其它时段自动退出
  16. postgre dinstinct on()的使用
  17. 我们一起踩过的坑----react(antd)(二)
  18. hdu2609 How many【最小表示法】【Hash】
  19. JQuery UI之Autocomplete(4)多值输入、远程缓存与组合框
  20. English trip -- Phonics 5 元音字母 o

热门文章

  1. buu学习记录(下)(做题是不可能做题的)
  2. 代码审计【根据功能点定向审计】BugFree ZSWin重装案例
  3. hihocoder 1489(微软2017, 数学,模拟)
  4. Day7 【Scrum 冲刺博客】
  5. CSS基础-Flexbox
  6. 响应式网站css reset
  7. day106:MoFang:BUG:获取数据验证token是否过期&amp;相册/相机取消头像无法显示&amp;MongoDB
  8. curl使用技巧汇总
  9. mybatis默认返回类型
  10. ORA-28017: The password file is in the legacy format