欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 新闻 > 社会 > parallelStream线程问题及解决方案

parallelStream线程问题及解决方案

2025/4/3 7:02:53 来源:https://blog.csdn.net/leo187/article/details/146601016  浏览:    关键词:parallelStream线程问题及解决方案

parallelStream可以在多个线程中并行处理流数据,提高性能。然而,如果在处理过程中涉及共享的可变状态,可能会导致线程不安全的问题。以下是一个简单的示例演示了如何在不正确的使用情况下导致线程安全问题:

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;public class ParallelStreamDemo {public static void main(String[] args) {// 使用一个普通的ArrayList来存储结果List<Integer> resultList = new ArrayList<>();// 创建一个范围从1到1000的列表List<Integer> numbers = new ArrayList<>();for (int i = 1; i <= 1000; i++) {numbers.add(i);}// 使用parallelStream尝试将每个数字的平方加入resultListnumbers.parallelStream().forEach(number -> {// 这是一个临界区,resultList被多个线程同时修改resultList.add(number * number);});// 输出结果大小System.out.println("Expected size: " + numbers.size());System.out.println("Actual size: " + resultList.size());// 打印结果列表中的一些内容System.out.println("Some elements in the result: " + resultList.subList(0, 10));}
}

问题分析:

  1. 线程不安全ArrayList是线程不安全的。在多个线程同时进行写操作时,可能导致数据丢失或者其他不一致的问题。

  2. 结果不准确:实际输出的resultList可能小于预期,因为当多个线程同时尝试写入同一个内存位置时,它们可能不会正确处理并发访问,导致某些写操作被忽略。

解决方案:

若要解决这样的问题,可以选择一些线程安全的集合类,例如 CopyOnWriteArrayList 或者使用同步机制来确保线程安全

import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;public class ParallelStreamThreadSafeDemo {public static void main(String[] args) {// 使用线程安全的CopyOnWriteArrayList来存储结果List<Integer> resultList = new CopyOnWriteArrayList<>();// 创建一个范围从1到1000的列表List<Integer> numbers = new ArrayList<>();for (int i = 1; i <= 1000; i++) {numbers.add(i);}// 使用parallelStream添加数字的平方到resultListnumbers.parallelStream().forEach(number -> {resultList.add(number * number);});// 输出结果大小System.out.println("Expected size: " + numbers.size());System.out.println("Actual size: " + resultList.size());System.out.println("Some elements in the result: " + resultList.subList(0, 10));}
}

通过使用CopyOnWriteArrayList,我们确保了在并发写时是线程安全的,这样就可以得到预期的结果。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词