美文网首页未分类
不要滥用parallel stream

不要滥用parallel stream

作者: alonwang | 来源:发表于2018-09-11 15:13 被阅读0次

parallel stream的优势:充分利用多线程,提高程序运行效率,但是正确的使用并不简单,盲目使用可能导致以下后果

  1. 效率不增反降
  2. 增加额外的复杂度,程序更易出错
  3. 运行结果不正确

效率不增反降

parallel stream是基于fork/join框架的,简单点说就是使用多线程来完成的,使用parallel stream时要考虑初始化fork/join框架的时间,如果要执行的任务很简单,那么初始化fork/join框架的时间会远多于执行任务所需时间,也就导致了效率的降低.
根据附录doug Lee的说明,任务数量*执行方法的行数>=10000或者执行的是消耗大量时间操作(如io/数据库)才有必要使用

增加额外的复杂度,程序更易出错

在spring框架中,假设有一组主键id,使用这组id去数据库获取记录

//DB.fetchRecord(long id)使用当前线程session连接数据库
ids.parallelStream().map(DB::fetchRecord).collect(Collections.toList());

这里使用parallel stream是正确的,但是运行会报错,类似于 can't obtain session from current thread.原因就是多线程运行,对应的线程没有绑定的session,要完成上面的功能需要提供一个特殊版本的DB方法

//不从线程获取session,而是在方法内部开启新的session
DB.fetchRecordWithoutSession(long id)

运行结果不正确

还是以上面的例子,session问题已经解决,如果获取到的记录需要和ids顺序相同,那么使用parallel获取到的结果就是不正确的,原因还是多线程

如何正确使用:

  1. 确保要执行的任务对线程环境没有依赖
  2. 任务消耗时间长/数据量大到不用思考是否要用parallel
  3. 结果没有顺序要求

1.Doug Lea对并行流的使用说明http://gee.cs.oswego.edu/dl/html/StreamParallelGuidance.html

  1. fork/join 框架介绍
    http://www.importnew.com/27334.html

相关文章

  • 不要滥用parallel stream

    parallel stream的优势:充分利用多线程,提高程序运行效率,但是正确的使用并不简单,盲目使用可能导致以...

  • 提示四十八:谨慎使用Stream并行

    提示四十八:谨慎使用Stream并行。 Java8 Stream中可以通过parallel方法非常简单的来实现并行...

  • Runtime の滥用典型

    不要滥用Runtime !!!不要滥用Runtime !!!不要滥用Runtime !!! 重要的事说三遍?。 先...

  • Bug 篇:Java 8 Parallel Stream 陷阱

    误区一:Java 8 中的 Stream 只要使用 parallel 就可以并行处理,只要使用 sequentia...

  • parallel stream 的线程分配

    在使用parallel stream时,我们知道它会并行地遍历集合中的元素,但是系统并不会为每一个元素分配一个线程...

  • Java 8 并行流(Parallel Stream) 介绍

    这篇博客,我们将介绍Java中的并行流(Parallel Stream)。 Java 8引入了并行流的概念来进行并...

  • stream 并行操作

    如果要使stream中的操作并行,使用起来非常简单,只要加parallel()就可以了 反之如果,想要让并行转换为...

  • 不要滥用空格

    今天特意去关注王思聪的微博。王思聪的微博很像一个普通网民,和自己的生活也息息相关,这位富二代公子很接地气,说的都是...

  • 不要滥用threadlocal

  • parallel

    parallel with parallel between in parallel with sb. or st...

网友评论

    本文标题:不要滥用parallel stream

    本文链接:https://www.haomeiwen.com/subject/jyaygftx.html