<!-- # 并行流处理(parallelStream) forEach 的重复问题 --> <!-- parallel-stream-for-each-repeat-problem --> 最近使用 *parallelStream* 方法在处理一些批量调用 *http* 接口时, 发现了部分列表项重复执行了. 示例代码如下: ```java aList.parallelStream() .forEach(item -> { // do something }); ``` 本以为是数据源的问题, 但查看打印的日志后发现数据源并没有问题, 这才想到是不是并行流处理导致的问题. [这篇博客][2]中介绍的比较详细, 其原因是数据源 `List<T>` 并不是线程安全的, 导致多线程在竞争获取列表项时出现了重复. 解决方案是使用 `Collections` 提供的一系列 *synchronized* 开头的静态方法, 将其转化为线程安全的对应类型. ```java Collections.synchronizedList(aList).parallelStream() .forEach(item -> { // do something }); ``` ## 参考 1. [parallel循环java_使用Java8新特性parallelStream遇到的坑][1] 2. [使用parallelStream进行遍历的坑,以及如何进行避免异步操作中出现的问题][2] [1]:https://blog.csdn.net/weixin_42108054/article/details/114507736 (parallel循环java_使用Java8新特性parallelStream遇到的坑) [2]:https://blog.csdn.net/qq_31840023/article/details/100579117 (使用parallelStream进行遍历的坑,以及如何进行避免异步操作中出现的问题) Loading... 版权声明:本文为博主「佳佳」的原创文章,遵循 CC 4.0 BY-NC-SA 版权协议,转载请附上原文出处链接及本声明。 原文链接:https://www.liujiajia.me/2021/7/31/-stream-for-each-repeat-problem 提交