iis服务器助手广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Java8 如何正确高效的使用并行流
  • 649
分享到

Java8 如何正确高效的使用并行流

2024-04-02 19:04:59 649人浏览 泡泡鱼

Python 官方文档:入门教程 => 点击学习

摘要

目录正确使用并行流,避免共享可变状态高效使用并行流流的数据源和可分解性java 并行计算的几点实践总结正确使用并行流,避免共享可变状态 错用并行流而产生错误的首要原因,就是使用的算法

正确使用并行流,避免共享可变状态

错用并行流而产生错误的首要原因,就是使用的算法改变了某些共享状态。下面是另一种实现对前n个自然数求和的方法,但这会改变一个共享累加器:


public static long sideEffectSum(long n) {
	Accumulator accumulator = new Accumulator();
	LongStream.rangeClosed(1, n).forEach(accumulator::add);
	return accumulator.total;
}
public class Accumulator {
	public long total = 0;
	public void add(long value) { total += value; }
}

有什么问题呢?

它在本质上就是顺序的。每次访问 total 都会出现数据竞争。如果用同步来修复,那就完全失去并行的意义了。

为了说明这一点,让我们试着把 Stream 变成并行的:


public static long sideEffectParallelSum(long n) {
	Accumulator accumulator = new Accumulator();
	LongStream.rangeClosed(1, n).parallel().forEach(accumulator::add);
	return accumulator.total;
}

测试下,输出

在这里插入图片描述

在这里插入图片描述

性能无关紧要了,唯一要紧的是每次执行都会返回不同的结果,都离正确值差很远。这是由于多个线程在同时访问累加器,执行 total += value ,而这却不是一个原子操作。问题的根源在于, forEach 中调用的方法有副作用它会改变多个线程共享的对象的可变状态。

要是你想用并行 Stream 又不想引发类似的意外,就必须避免这种情况。

所以共享可变状态会影响并行流以及并行计算,要避免共享可变状态,确保并行 Stream 得到正确的结果。

高效使用并行流

是否有必要使用并行流?

  • 如果有疑问,多次测试结果。把顺序流转成并行流轻而易举,但却不一定是好事
  • 留意装箱。自动装箱和拆箱操作会大大降低性能

Java 8中有原始类型流( IntStream 、LongStream 、 DoubleStream )来避免这种操作,但?有可能都应该用这些流。

  • 有些操作本身在并行流上的性能就比顺序流差。特别是 limit 和 findFirst 等依赖于元素顺序的操作,它们在并行流上执行的代价非常大。

例如, findAny 会比 findFirst 性能好,因为它不一定要按顺序来执行。可以调用 unordered 方法来把有序流变成无序流。那么,如果你需要流中的n个元素而不是专门要前n个的话,对无序并行流调用limit 可能会比单个有序流(比如数据源是一个 List )更高效。

  • 还要考虑流的操作流水线的总计算成本。

设N是要处理的元素的总数,Q是一个元素通过流水线的大致处理成本,则N*Q就是这个对成本的一个粗略的定性估计。Q值较高就意味着使用并行流时性能好的可能性比较大。

  • 对于较小的数据量,选择并行流几乎从来都不是一个好的决定。并行处理少数几个元素的好处还?不上并行化造成的额外开销
  • 要考虑流背后的数据结构是否易于分解。

例如, ArrayList 的拆分效率比 LinkedList高得多,因为前者用不着遍历就可以平均拆分,而后者则必须遍历。另外,用 range 工厂方法创建的原始类型流也可以快速分解。

  • 流自身的特点,以及流水线中的中间操作修改流的方式,都可能会改变分解过程的性能。

例如,一个 SIZED 流可以分成大小相等的两部分,这样每个部分都可以比较高效地并行处理,但筛选操作可能丢弃的元素个数却无法预测,导致流本身的大小未知。

  • 还要考虑终端操作中合并步骤的代价是大是小(例如 Collector 中的 combiner 方法)

如果这一步代价很大,那么组合每个子流产生的部分结果所付出的代价就可能会超出通过并行流得到的性能提升。

流的数据源和可分解性

在这里插入图片描述

最后, 并行流背后使用的基础架构是Java 7中引入的分支/合并框架了解它的内部原理至关重要。

java 并行计算的几点实践总结

稍微接触了 java 的并行计算,谈谈几点浅显的总结吧

并行计算不一定比串行计算快,一般在大规模问题才会显示出优势

结合 lambda 表达式的 parallelStream 可以方便调用并行计算,但可能会出现空指针错误,解决这一问题可能需要更高级的多线程知识

看网上资料,Collection 类型对并行计算支持的好,一般数组类型支持的一般。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

--结束END--

本文标题: Java8 如何正确高效的使用并行流

本文链接: https://www.lsjlt.com/news/156459.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Java8 如何正确高效的使用并行流
    目录正确使用并行流,避免共享可变状态高效使用并行流流的数据源和可分解性java 并行计算的几点实践总结正确使用并行流,避免共享可变状态 错用并行流而产生错误的首要原因,就是使用的算法...
    99+
    2024-04-02
  • Java8中怎么正确高效的使用并行流
    这篇文章主要为大家展示了“Java8中怎么正确高效的使用并行流”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Java8中怎么正确高效的使用并行流”这篇文章吧。正确使用并行流,避免共享可变状态错用...
    99+
    2023-06-25
  • 如何让python程序正确高效地并发
    目录python线程何时需要拥有GIL?认知模型1:同一时刻只有一个线程运行python代码模型2:不保证每 5 毫秒释放一次 GIL模型3:非 Python 代码可以显式释放 GI...
    99+
    2024-04-02
  • 如何正确的在Java8中使用lambda表达式
    如何正确的在Java8中使用lambda表达式?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。1.基本介绍lambda表达式,即带有参数的表达式,为了更清晰地理解lambda...
    99+
    2023-05-31
    java8 lambda ava
  • lambda表达式如何正确的在Java8项目中使用
    这篇文章给大家介绍lambda表达式如何正确的在Java8项目中使用,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。在Java8 里面Lambda是最火的主题,不仅仅是因为语法的改变,更重要的是带来了函数式编程的思想,我...
    99+
    2023-05-31
    java8 lambda ava
  • 使用Java8中Optional机制的正确姿势
    前言Java8带来的函数式编程特性对于习惯命令式编程的程序员来说还是有一定的障碍的,我们只有深入了解这些机制的方方面面才能运用自如。Null的处理在JAVA编程中是出了try catch之外的另一个头疼的问题,需要大量的非空判断模板代码,程...
    99+
    2023-05-30
    java8 optional 使用
  • GO如何使用Mutex确保并发程序正确性
    这篇“GO如何使用Mutex确保并发程序正确性”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“GO如何使用Mutex确保并发程...
    99+
    2023-07-05
  • win7并行配置不正确如何处理
    这篇文章主要介绍了win7并行配置不正确如何处理的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇win7并行配置不正确如何处理文章都会有所收获,下面我们一起来看看吧。首先点击左下角开始,然后点击“控制面板”。 点...
    99+
    2023-07-02
  • windows并行配置不正确如何处理
    这篇文章主要介绍“windows并行配置不正确如何处理”,在日常操作中,相信很多人在windows并行配置不正确如何处理问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”windows并行配置不正确如何处理”的疑...
    99+
    2023-07-02
  • 如何在Go语言中使用正确的数据类型实现高效的并发和存储?
    Go语言是一种强大的编程语言,旨在为现代计算机体系结构提供高效的编程体验。在Go语言中,正确的数据类型选择可以实现高效的并发和存储操作。本文将介绍如何在Go语言中使用正确的数据类型实现高效的并发和存储。 一、并发 Go语言的并发模型是基于g...
    99+
    2023-08-20
    并发 存储 数据类型
  • 如何正确的使用WeakHashMap
    这篇文章给大家介绍如何正确的使用WeakHashMap,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。 在学习WeakHashMap时了解到,如果map里面的key只有map本身引用时,就会将key对应的Entry清除掉...
    99+
    2023-05-30
    weakhashmap
  • 如何正确的使用JDBC
    今天就跟大家聊聊有关 如何正确的使用JDBC,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。什么是JDBCJDBC(Java Database Connectivity),即Java数...
    99+
    2023-05-31
    jdbc jdb
  • 如何正确的使用 jsonpath
    今天就跟大家聊聊有关如何正确的使用 jsonpath,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。java项目demo:注意: 其中他的max,min,avg,stddev函数只能类...
    99+
    2023-06-06
  • 如何正确的使用supervisor
    这期内容当中小编将会给大家带来有关如何正确的使用supervisor,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。软硬件环境centos7.6.1810 64bitcat /etc/redhat...
    99+
    2023-06-06
  • 如何正确的使用JAXB
    这期内容当中小编将会给大家带来有关如何正确的使用JAXB,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。一、jaxb是什么     JAXB是Java Archite...
    99+
    2023-05-31
    jaxb
  • 如何正确的使用TypeScript
    如何正确的使用TypeScript,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。一、TypeScript 是什么TypeScript 是一种由微软开发的自由和开源的编程语言...
    99+
    2023-06-17
  • 如何正确的使用Puppet
    今天就跟大家聊聊有关如何正确的使用Puppet,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。1. 概述 puppet是一个开源的软件自动化配置和部署工具,它使用简单且功能强大,正得到...
    99+
    2023-06-12
  • 如何正确的使用pytest
    本篇文章为大家展示了如何正确的使用pytest,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。1、安装pytest,打开dos窗口输入:pip install pytest2、通过pycharm工具下...
    99+
    2023-06-07
  • 如何正确的使用CMake
    如何正确的使用CMake?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。CMake是一个比make更高级的编译配置工具,它可以根据不同平台、不同的编译器,生成相应的Makef...
    99+
    2023-06-08
  • 如何正确的使用numpy.sum()
    这篇文章给大家介绍如何正确的使用numpy.sum(),内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。numpy的sum函数可接受的参数是:sum(a, axis=None, dtype=None,&...
    99+
    2023-06-15
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作