前言

java8除了新增stream,还提供了parallel stream-多线程版的stream,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. CF451A Game With Sticks 水题
  2. RRD
  3. 使用POI来实现对Excel的读写操作
  4. Machine Learning/Introducing Logistic Function
  5. php实现人员的权限管理
  6. BZOJ3032 七夕祭
  7. SAS 选取部分观测
  8. Codeforces986C AND Graph 【位运算】【dfs】
  9. 随机函数rand()和srand()
  10. 51Nod - 1384 正常解法
  11. swift 需求: 导航栏和HeaderView 使用一个背景图片。
  12. 自己对Java的一些认识
  13. ubuntu: apt-get update的时候遇到“Hash Sum mismatch”错误
  14. Log4j基础知识
  15. JAVA内部线程1
  16. C++ Boost在Windows和Linux下的编译安装
  17. linux ln链接详解
  18. PAT——1057. 数零壹
  19. Leetcode-Permuation Sequence
  20. js原型链继承及调用父类方法

热门文章

  1. etcd3.0集群安装
  2. 数据结构C语言实现----树
  3. PHP 循环 - While 循环
  4. PHP natsort() 函数
  5. PHP mysqli_thread_safe() 函数
  6. Linux常用命令之ls、cd、pwd、mkdir命令讲解
  7. 学习JDBC这一篇就够了
  8. 最后通牒!8月1日开始ios中国区下架全部无版号游戏
  9. demo3同通讯录展示的方式分组排序
  10. 如何从appstore下架自己家的app