首页 > 其他分享 >parallelStream中的线程安全问题

parallelStream中的线程安全问题

时间:2022-10-14 12:41:55浏览次数:51  
标签:遍历 安全 线程 排序 集合 parallelStream 数据


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);
});

标签:遍历,安全,线程,排序,集合,parallelStream,数据
From: https://blog.51cto.com/u_15829196/5756182

相关文章

  • 防火墙基础之多分支安全防护和无线网络综合部署​
    防火墙基础之多分支安全防护和无线网络综合部署​原理概述:​防火墙(英语:Firewall)技术是通过有机结合各类用于安全管理与筛选的软件和硬件设备,帮助计算机网络于其内、外网之间......
  • 网络安全中三保一评分别是什么?有什么作用?
    初入行学网络安全的时候,大家肯定听说过或了解过“三保一评”,那么你知道网络安全中“三保一评”是什么吗?所谓三保一评指的就是分保、等保、关保以及密评,接下来通过这篇......
  • 我是一个线程
    我是一个线程第一回初生牛犊我是一个线程,我一出生就被编了个号:0x3704,然后被领到一个昏暗的屋子里,在这里我发现了很多和我一模一样的同伴。我身边的同伴0x6900待的时......
  • 个人珍藏的80道多线程并发面试题(1-10答案解析)
    前言​个人珍藏的80道Java多线程/并发经典面试题,因为篇幅太长,现在先给出1-10的答案解析哈,后面一起完善,并且上传github哈~❝​​https://github.com/whx123/JavaHome​​❞「......
  • java多线程
    process进程thread线程三种创建方式Threadclass继承Thread类创建线程方式一:继承Thread类,重写run()方法,调用start开启线程 继承Thread类,首先重写run方法,然后在主程......
  • 《信息安全与设计》第四章学习笔记
    第4章并发编程知识点归纳并行性和并发性1.真正的并行执行只能在多个处理组件的系统中实现,比如多处理器或多核系统。2.在单CPU系统中,并发性是通过多任务处理实现的。......
  • 这些智能合约漏洞,可能会影响你的账户安全!​ 什么是形式化验证?​
    这些智能合约漏洞,可能会影响你的账户安全!​什么是形式化验证?​维基百科对形式化验证的解释是这样的:在计算机硬件(特别是集成电路)和软件系统的设计过程中,形式化验证的含义是根......
  • vr煤矿安全教育体验事故发生经过及伤害-深圳华锐视点
    VR煤矿安全教育培训:通过VR仿真模拟,让受训人员身临其境感受事故发生经过,从而在内心深处对事故产生敬畏心理,全面提高员工杜绝事故和处理事故的能力。1.行业背景......
  • JAVA 多线程
    JVM:1.虚拟机栈和程序计数器每个线程会单独生成2.方法区和堆是多线程共享的 多线程优点: 1、提高计算机系统CPU的利用率2、将既长又复杂的进程分为多个线程,独立运......
  • 常见的网络安全风险有哪些?
    勒索软件勒索软件(Ransomware,又称勒索病毒)是一种恶意软件,它的工作方式基本与计算机病毒类似,不过跟一般的计算机病毒不同,它们不会直接地破坏数据,而是将数据进行加密锁定,然后......