前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >parallelStream中的线程安全问题

parallelStream中的线程安全问题

作者头像
海仔
发布2019-08-06 11:04:47
1.8K0
发布2019-08-06 11:04:47
举报
文章被收录于专栏:海仔技术驿站海仔技术驿站

parallelStream中的线程安全问题

在面试的时候很多人喜欢问并发编程,那么在实际开发中我们能用到多少呢?今天在这里举个例子就是实际开发中的并发编程的问题。在我们经常写的业务代码中很多时候会出现遍历循环的情况,比如取集合数据、封装集合数据等等,这是我们不能避免的。 在jdk1.8中给我们提供了stream;为什么在很多时候我们的遍历还是进行普通的循环?因为这个和我们的编程习惯有关系,我最初接触的就是普通的循环,而且一用很多年,所以有时候在业务很紧急的情况下,首先码出来的肯定是我们千锤百炼的手法。这不是我们的错,错就错在了谁让它出的这么晚了?如果从一开始就用的是stream,那你用起来肯定比别人快很多。在这里不是教大家怎么使用流,这个百度一大堆。在这里说的是使用并行会出现很多问题。言归正传! 在很多时候普通的for循环以后够了,因为数据量不大的情况下,jdk底层对它的优化是非常好的。所以看情况而定,不是说所有的循环都要用流遍历。大数据量的遍历用parallelStream可以比普通遍历节省一半的时间,这个亲测过。 在使用stream.foreach时这个遍历没有线程安全问题,但是使用parallelStream就会有线程安全问题,所有在parallelStream里面使用的外部变量,比如集合一定要使用线程安全集合,不然就会引发多线程安全问题。在并行时,实际上是多个线程执行,这个时候还有个问题,就是当你在遍历中使用例如请求里面的数据时,就会报一个异常,这个异常就是多个线程执行,但是其他线程没有这个请求的数据,所以获取不到。这时解决办法是把需要的数据在遍历外面取到,再传递进去就可以解决。 在这里顺带说一下排序,尽量不要自己去实现排序,这个性能并不理想。尽量用jdk自己的排序,底层对jdk排序优化,不是我们所能比拟的。这个也是亲测过的。 例如 : // 这是假设的数据

Map<Integer, Object> dataMap = Maps.newConcurrentMap(); Map<Integer, Object> error = Maps.newConcurrentMap(); Map<Integer, Object> rest = new TreeMap<Integer, Object>(new Comparator() { @Override public int compare(Integer o1, Integer o2) { return o1.compareTo(o2); } }); // 假设这是一个需要从请求中获取的数据,所以先从外面获取,再传递进去 String number = request.getParameter(‘number’); // 假设封装了一个集合数据 List listStudent = new ArrayList<>(); listStudent.parallelStream().forEach(student -> { // 在遍历时取索引 int index = listStudent.indexOf(student); // 校验数据 handleData(index, student, number, error, dataMap); });

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018年12月14日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • parallelStream中的线程安全问题
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档