开发经理:谁在项目里面用Stream. paraller()直接gun

大家好,我是小玺,今天给大家分享一下项目中关于Stream.parallel() 碰到的坑。

Stream.parallel() 是Java 8及以上版本引入的Stream API中的一个方法,它用于将一个串行流转换为并行流。并行流可以在多个处理器上同时执行操作,从而显著提高对大量数据进行处理的性能。

踩坑日记

某个大型项目,晚上十一点多有个用户对小部分数据进行某项批量操作后,接口大半天没有反应最后返回超时报错,但是过了一段时间后,出现了部分数据被修改成功,部分数据则没有反应。用户立马跳起来,打电话投诉到公司领导层,于是乎领导层对上至开发经理和PM,下至小开发进行会议批斗,要求马上排查并解决问题,毕竟项目这么大,当初也是要求测试做过压测的,怎么出现这么大的生产事故。

于是乎开发和实施运维分头行事,开发人员排查问题,实施人员先把问题数据维护好,不能应该用户使用。一群开发也是很疑惑,开发和测试环境都没法复现出问题,简单过一下代码也没看出个所以然,由于时间问题,不得不呼叫一手开发经理帮忙看看,开发经理后台接口看完Stream.parallel()进行的操作代码立马就炸了,git看了下提交人【会笑】,把这个开发从头到脚喷了一遍。

在对会笑单独进行了长达半小时的"耐心教育"后(ps:问题安排另一名开发同事修复),开发经理给团队的所有后端开发人员又都教育了一遍。原来会笑在用并行流的时候,没有考虑线程安全和事务问题,把一堆数据进行了批量更新和保存,并且还涉及到了一些重复数据的修改导致资源竞争产生了死锁。

雀食对于一些初中级开发来说,开发过程中往往喜欢用一些比较新颖的写法来实现但是对新语法又是一知半解的,Stream.parallel()作为Java的新特性,也就成了其中一个反面教材。如果操作数据量不大的情况,其实没有必要用到Stream.parallel(),效率反而会变差。以下是我对Stream.parallel()简单整理,避免踩坑。

使用说明

当调用 stream.parallel() 时,这意味着Java运行时系统将会尽可能地利用可用的硬件资源(通常是CPU核心数),将流的操作分成多个部分,并在不同的线程中并发执行这些部分。这特别适用于数据集较大且操作可以独立应用于每个元素的情况下。

例如,假设你有一个包含大量元素的列表,并想要对每个元素执行一些计算密集型操作,而这些操作之间不存在依赖关系。在这种情况下,通过调用 parallel() 方法,可以启动并行处理:

java 复制代码
List<Integer> numbers = ...;
// 假设这是个很大的整数列表
numbers.parallelStream()
// 对每个元素进行昂贵的计算 
.map(n -> expensiveComputation(n))
// 收集结果
.collect(Collectors.toList());

然而,值得注意的是:

  1. 线程安全:并行流并不能保证线程安全性,因此,如果流中的元素是共享资源或操作本身不是线程安全的,你需要确保正确同步或使用线程安全的数据结构。
  2. 数据分区:Java的并行流机制会自动对数据进行分区,但在某些情况下,数据分区的开销可能大于并行带来的收益,特别是对于小规模数据集。
  3. 效率考量:并非所有的流操作都能从并行化中受益,有些操作(如短流操作或依赖于顺序的操作)并行执行反而可能导致性能下降。而且,过多的上下文切换也可能抵消并行带来的优势。
  4. 资源消耗:并行流默认使用的线程池大小可能与机器的实际物理核心数相适应,但也可能与其他并发任务争夺系统资源。
  5. 结果一致性:并行流并不保证执行的顺序性,也就是说,如果流操作的结果依赖于元素的处理顺序,则不应该使用并行流。
  6. 事务处理:在涉及到事务操作时,通常需要避免在并行流中直接处理,如上述例子所示,应当将事务边界放在单独的服务方法内,确保每个线程内的事务独立完成。

总之,Stream.parallel() 是一个强大的工具,有助于提高大规模数据处理的性能,但在实际使用时需谨慎评估是否适合并行化处理,以及如何有效地解决可能出现的并发问题。

相关推荐
杨哥带你写代码几秒前
足球青训俱乐部管理:Spring Boot技术驱动
java·spring boot·后端
郭二哈26 分钟前
C++——模板进阶、继承
java·服务器·c++
A尘埃31 分钟前
SpringBoot的数据访问
java·spring boot·后端
yang-230733 分钟前
端口冲突的解决方案以及SpringBoot自动检测可用端口demo
java·spring boot·后端
沉登c33 分钟前
幂等性接口实现
java·rpc
代码之光_19801 小时前
SpringBoot校园资料分享平台:设计与实现
java·spring boot·后端
科技资讯早知道2 小时前
java计算机毕设课设—坦克大战游戏
java·开发语言·游戏·毕业设计·课程设计·毕设
小比卡丘2 小时前
C语言进阶版第17课—自定义类型:联合和枚举
android·java·c语言
xmh-sxh-13143 小时前
java 数据存储方式
java
liu_chunhai3 小时前
设计模式(3)builder
java·开发语言·设计模式