JVM 并发性: Java 和 Scala 并发性基础001

艾叔:Scala编程基础入门教程(001)-ScalaJava比较、Scala对于初学者的缺点 1.1  Scala是一门强大的语言,那么,它其它主流的编程语言相比,有什么特点? 1)Scala支持面向对象,在Scala上完全可以像C++/Java那样,使用面向对象的特性; 2)Scala兼容Java库,Scala程序是基于JVM运行的,Scala代码编译后,输出文件是可以在JVM上运行的字节码,因此,它与丰富的Java库是完全兼容的,在Scala代码中,可以无缝调用Java库所提供的... 阅读详情

1.Java™ 平台对所有基于 JVM 的语言中的并发编程提供了优秀的支持。Scala 扩展了 Java 语言中的并发性支持,提供了更多在处理器之间共享工作和协调结果的方式。

从那时起,处理器制造商更多地是通过增加核心来提高芯片性能,而不再通过增加时钟速率来提高芯片性能。多核系统现在成为了从手机到企业服务器等所有设备的标准,而这种趋势可能继续并有所加速。开发人员越来越需要在他们的应用程序代码中支持多个核心,这样才能满足性能需求。

您将了解一些针对 Java 和 Scala 语言的并发编程的新方法,包括 Java 如何将 Scala 和其他基于 JVM 的语言中已经探索出来的理念结合在一起

您将了解如何使用 Java ExecutorServiceForkJoinPool 类来简化并发编程。还将了解一些将并发编程选项扩展到纯 Java 中的已有功能之外的基本 Scala 特性。在此过程中,您会看到不同的方法对并发编程性能有何影响。后续几期文章将会介绍 Java 8 中的并发性改进和一些扩展,包括用于执行可扩展的 Java 和 Scala 编程的 Akka 工具包。

Java 并发性支持

在 Java 平台诞生之初,并发性支持就是它的一个特性,线程和同步的实现为它提供了超越其他竞争语言的优势。Scala 基于 Java 并在 JVM 上运行,能够直接访问所有 Java 运行时(包括所有并发性支持)。所以在分析 Scala 特性之前,我首先会快速回顾一下 Java 语言已经提供的功能。


Java 线程基础

在 Java 编程过程中创建和使用线程非常容易。它们由 java.lang.Thread 类表示,线程要执行的代码为 java.lang.Runnable 实例的形式。如果需要的话,可以在应用程序中创建大量线程,您甚至可以创建数千个线程。在有多个核心时,JVM 使用它们来并发执行多个线程;超出核心数量的线程会共享这些核心。

线程操作的协调难以让人理解。只要从程序的角度让所有内容保持一致,Java 编译器和 JVM 就不会对您代码中的操作重新排序,这使得问题变得更加复杂。

例如:如果 a 线程 : 两个相加操作q =  m+b , b  线程 需要 读取 q 的值 ,  (但是 编译器或 JVM 不不会保证按照与指定的顺序来执行 ) 这样 b 线程 可能 在 a 线程执行

的过程中 , 就读取了 q 的数值 , 这样就不对 ;

硬件也有可能带来线程问题。现代系统使用了多种缓存内存级别,一般来讲,不是系统中的所有核心都能同时看到这些缓存。当某个核心修改内存中的一个值时,其他核心可能不会立即看到此更改。

由于这些问题,在一个线程使用另一个线程修改的数据时,您必须显式地控制线程交互方式。Java 使用了特殊的操作来提供这种控制,在不同线程看到的数据视图中建立顺序。基本操作是,线程使用 synchronized 关键字来访问一个对象。当某个线程在一个对象上保持同步时,该线程将会获得此对象所独有的一个锁的独占访问。如果另一个线程已持有该锁,等待获取该锁的线程必须等待,或者被阻塞,直到该锁被释放。当该线程在一个 synchronized 代码块内恢复执行时,Java 会保证该线程可以 “看到了” 以前持有同一个锁的其他线程写入的所有数据,但只是这些线程通过离开自己的 synchronized 锁来释放该锁之前写入的数据。这种保证既适用于编译器或 JVM 所执行的操作的重新排序,也适用于硬件内存缓存。一个 synchronized 块的内部是您代码中的一个稳定性孤岛,其中的线程可依次安全地执行、交互和共享信息。


Java 5:并发性的转折点

Java 从一开始就包含对线程和同步的支持。但在线程间共享数据的最初规范不够完善,这带来了 Java 5 的 Java 语言更新中的重大变化 (JSR-133)。Java Language Specification for Java 5 更正并规范化了 synchronizedvolatile 操作。该规范还规定不变的对象如何使用多线程。(基本上讲,只要在执行构造函数时不允许引用 “转义”,不变的对象始终是线程安全的。)以前,线程间的交互通常需要使用阻塞的 synchronized 操作。这些更改支持使用 volatile 在线程间执行非阻塞协调。因此,在 Java 5 中添加了新的并发集合类来支持非阻塞操作 — 这与早期仅支持阻塞的线程安全方法相比是一项重大改进。

在变量上对 volatile 关键字的使用,为线程间的安全交互提供了一种稍微较弱的形式。synchronized 关键字可确保在您获取该锁时可以看到其他线程的存储,而且在您之后,获取该锁的其他线程也会看到您的存储。volatile 关键字将这一保证分解为两个不同的部分。如果一个线程向 volatile 变量写入数据,那么首先将会擦除它在这之前写入的数据。如果某个线程读取该变量,那么该线程不仅会看到写入该变量的值,还会看到写入的线程所写入的其他所有值。所以读取一个 volatile 变量会提供与输入 一个 synchronized 块相同的内存保证,而且写入一个 volatile 变量会提供与离开 一个 synchronized 块相同的内存保证。但二者之间有很大的差别:volatile 变量的读取或写入绝不会受阻塞。


在变量上对 volatile 关键字的使用,为线程间的安全交互提供了一种稍微较弱的形式。synchronized 关键字可确保在您获取该锁时可以看到其他线程的存储,而且在您之后,获取该锁的其他线程也会看到您的存储。volatile 关键字将这一保证分解为两个不同的部分。如果一个线程向 volatile 变量写入数据,那么首先将会擦除它在这之前写入的数据。如果某个线程读取该变量,那么该线程不仅会看到写入该变量的值,还会看到写入的线程所写入的其他所有值。所以读取一个 volatile 变量会提供与输入 一个 synchronized 块相同的内存保证,而且写入一个 volatile 变量会提供与离开 一个 synchronized 块相同的内存保证。但二者之间有很大的差别:volatile 变量的读取或写入绝不会受阻塞。


ava.util.concurrent 分层结构包含一些集合变形,它们支持并发访问、针对原子操作的包装器类,以及同步原语。这些类中的许多都是为支持非阻塞访问而设计的,这避免了死锁的问题,而且实现了更高效的线程。这些类使得定义和控制线程之间的交互变得更容易,但他们仍然面临着基本线程模型的一些复杂性。

java.util.concurrent 包中的一对抽象,支持采用一种更加分离的方法来处理并发性:Future<T> 接口、ExecutorExecutorService 接口。这些相关的接口进而成为了对 Java 并发性支持的许多 Scala 和 Akka 扩展的基础,所以更详细地了解这些接口和它们的实现是值得的。

java.util.concurrent 包中的一对抽象,支持采用一种更加分离的方法来处理并发性:Future<T> 接口、ExecutorExecutorService 接口。这些相关的接口进而成为了对 Java 并发性支持的许多 Scala 和 Akka 扩展的基础,所以更详细地了解这些接口和它们的实现是值得的。

Future<T> 是一个 T 类型的值的持有者,但奇怪的是该值一般在创建 Future 之后才能使用。正确执行一个同步操作后,才会获得该值。收到 Future 的线程可调用方法来:

  • 查看该值是否可用
  • 等待该值变为可用
  • 在该值可用时获取它
  • 如果不再需要该值,则取消该操作

Future 的具体实现结构支持处理异步操作的不同方式。

Executor 是一种围绕某个执行任务的东西的抽象。这个 “东西” 最终将是一个线程,但该接口隐藏了该线程处理执行的细节。

Executor 本身的适用性有限,ExecutorService 子接口提供了管理终止的扩展方法,并为任务的结果生成了 FutureExecutor 的所有标准实现还会实现 ExecutorService



并发性性能

要充分利用系统上可用的处理器数量,必须为 ExecutorService 配置至少与处理器一样多的线程。您还必须将至少与处理器一样多的任务传递给 ExecutorService 来执行。实际上,您或许希望拥有比处理器多得多的任务,以实现最佳的性能。这样,处理器就会繁忙地处理一个接一个的任务,近在最后才空闲下来。但是因为涉及到开销(在创建任务和 future 的过程中,在任务之间切换线程的过程中,以及最终返回任务的结果时),您必须保持任务足够大,以便开销是按比例减小的。


Fork-Join
Java 7 引入了 ExecutorService 的另一种实现: ForkJoinPool 类。 ForkJoinPool 是为高效处理可反复分解为子任务的任务而设计的,它使用 RecursiveAction 类(在任务未生成结果时)或 RecursiveTask<T> 类(在任务具有一个 T 类型的结果时)来处理任务。 RecursiveTask<T> 提供了一种合并子任务结果的便捷方式


这些结果表明,如果可调节应用程序中的任务大小来实现最佳的性能,那么使用标准 ThreadPoolForkJoin 更好。但请注意,ThreadPool 的 “最佳性能点” 取决于具体任务、可用处理器数量以及您系统的其他因素。一般而言,ForkJoin 以最小的调优需求带来了优秀的性能,所以最好尽可能地使用它。



Java ForkJoin 代码的性能比每种 Scala 实现都更好,但 DirectBlockingDistance 在 1,024 的块大小下提供了更好的性能。两种 Scala 实现在大部分块大小下,都提供了比 清单 1 中的 ThreadPool 代码更好的性能。













【Linux系统】Kdenlive软件多机位同音频视频同步化处理 Kdenlive简介 官网链接:https://kdenlive.org/zh/ 命令行安装: apt-get install kdenlive Kdenlive能够进行多轨道视频编辑,可以使用调整多条音频、视频轨道。每条轨道可以按需进行单独锁定、静音。 Kdenlive多机位同音频视频同步化处理步骤 1. 新建Kdenlive文件 选择<文件>-<新建>,建立新的kdenlive文件,初始设置为<视频轨:2>,<音频轨:2>。 视. 阅读详情

相关推荐

《大数据: Scala 原理介绍》

一、Scala 原理介绍 (重点) =*=*=*=*= (从现在开始学习Scala 模式是对比Java来说,相当于复习一部分Java,对比着学习也更好的说明Scala的优点)=*=*=*=*= Java:定义类,然后在类中定义一个静态的main方法 scala:没有静态的概念,创建对象,在对象中定义main方法 1.Scala执行流程分析 2.Scala程序基本结构 (先了解) 完全面向对象: scala完全面向对象,故scala去掉了java中非面向对象的元素,如static关键...

yexiangCSDN的专栏 550

Scala并发编程

  Scala语言有很多优点,比如简洁、强大的表现力等等。但我最关注的,是它在并发编程方面的优势。     Scala通过强调对象的不变性 以及使用基于事件的模型进行线程间通信 使得实现并发应用变得简单。     不变对象   并发编程之所以这么困难,很大一个原因在于对象的可变性。要在充斥着大量可变对象的程序里面实现安全并发,需要非常繁琐以及复杂易错的同步操作来保证状态更新的同步。 ...

andyhu1007的专栏 489

【即插即用模块】Transformer篇 | TCSVT 2025 | DAFM:双注意力聚合+反向跨模态筛选,特征精准捕捉并融合!

本文提出了一种双模态注意力融合模块(DAFM),用于增强多模态图像融合任务中的特征交互。该模块通过双注意力聚合机制,结合自注意力与跨模态注意力,有效提升特征融合效果。DAFM采用可学习平衡因子动态调整注意力权重,并运用深度卷积降低计算复杂度。实验结果表明,该模块能显著提升多模态图像融合质量,适用于RGB-红外等双模态视觉任务。模块代码实现简洁,可直接集成到现有网络中作为特征融合层使用。

主要更新底层视觉(去噪、超分等)相关的科研内容,形式为【论文精读】+【论文复现】 151

Scala入门到精通——第二十六节 Scala并发编程基础

作者:摇摆少年梦 视频地址:http://www.xuetuwuyou.com/course/12 本节主要内容 Scala并发编程简介 Scala Actor并发编程模型 react模型 Actor的几种状态 Actor深入使用解析 1. Scala并发编程简介 2003 年,Herb Sutter 在他的文章 “Th...

weixin_33937778的博客 439

scala系列--并发01

最近研究了一些scala并发的知识,总结一下。 一.简介 即时响应性是一项决定任何应用程序成败的关键因素。有两种方式来提高即时响应性:1.多线程,并行运行多个任务。2.有策略的计算,惰性运行任务。 二.惰性求值 1.短路控制,scala不会向前看,所以用到lazy。注意:多个变量绑定,后续调用,顺序不可预知。 2.惰性集合,创建临时视图,调用的时候立即求值。 3.无限流转换有限流 ...

独立开发,substack顶级编辑 1778

scala并发_深入研究Scala并发

关于本系列 Ted Neward深入探讨了Scala编程语言,并带您一起学习。 在这个developerWorks 系列文章中 ,您将了解最新的炒作内容,并了解Scala在实践中的语言能力。 无论有什么比较之处,Scala代码Java™代码都将并排显示,但是(正如您将发现的那样),Scala中的许多内容与您在Java中发现的任何内容都没有直接关联-这就是Scala的魅力所在! 毕竟,如...

cusi77914的博客 849

Scala,基于JVM并发语言

无意中看到这篇文章,开始还以为是在Java中实现Threadless的并发,结果看下去才发现是基于JVM的一门语言 Scala。它面向对象,函数式,静态类型,更重要是克隆了Erlang里面的进程间通讯的概念。 下载后,使用它的...

ciyi1125866526的博客 265

Scala 001 概念

Scala是什么? Scala是运行在jvm上的多范式编程语言,同时支持面向对象面向函数编程。 多范式:多种风格,即同时支持面向对象面向函数编程。 在进行集合运算时,可以经常看到面向函数编程。 Scala很早就出现了,但是它是在大数据兴起时才流行起来的。 Scala最大的优点是简洁性,java几百行的代码,用scala只需要十几行就能搞定。 为什么使用ScalaScala在编写Spa...

大数据流浪法师的学习笔记与分享 396

scala001

Scala 编程 -Scala基础 1.课程目标 安装Scala编译运行环境 熟悉Scala基本语法以及函数式编程 熟练掌握Scala数据结构使用以及集合方法操作 2.scala简介以及安装 scala概念:面向对象面向函数的多范式编程语言,scala也是基于jvm的编程语言,并且scala可以java的语法兼容。 面向对象:scala是纯面向对象的语言。举例:1+2 :1 其实对象...

weixin_30697239的博客 150

[Scala]001-初识

Scala,发音:skɑːlə。取自于 Scalable(可伸缩、可扩展的)Language简写。 01、基本概念 1)多范式:多种编程方法。目前有四种程序设计方法:面向过程、面向对象、函数式、泛型。 编程范式(programming paradigm(范例、样式、典范)),是指计算机编程的基本风格或典范模式。借用哲学术语,如果说每个编程者都在创造虚拟世界,那么编程范式就是他们置身其中自觉不自觉...

神是念着倒 387

Scala语言】scala简介_scala环境搭建_创建scala工程demo_ javascala执行效率比较_scala的REPL交互式解释器

001-scala基础语法scala简介为什么要使用scalascala开发环境安装安装JDK安装scala SDK安装IDEA的scala插件创建demo工程javascala执行效率比较 scala简介 scala是运行在 JVM 上的多范式编程语言,同时支持面向对象面向函数编程 JVMjava虚拟机 多范式:java语言是面向对象编程的语言,随着jdk不断的升级,开始慢慢支持一些面向函数式的编程。而scala具有具有这两种风格。 scala的主要优势:表达性 随着sparkkafka作为大数

一梦 514

scala语言学习

scala源代码被编译成java字节码,他可以运行在JVM之上,可以调用现有的java库对象 -对象有属性行为。例如:一只狗的状属性有:颜色,名字,行为有:叫、跑、吃等。对象是一个类的实例。类 -类是对象的抽象,而对象是类的具体实例。方法 -方法描述的基本的行为,一个类可以包含多个方法。字段 -每个对象都有它唯一的实例变量集合,即字段。对象的属性通过给字段赋值来创建。Scala 基本语法需要注意以下几点:区分大小写。

weixin_73453902的博客 1742

Scala的安装部署&Maven的安装部署

scala的基本知识 1.Scala是什么?(学会看官网:The Scala Programming Language (scala-lang.org)) Scala是一门多范式语言,类似于java,设计初衷是①实现可伸缩的语言;②集成面向对象编程(object-oriented)函数式编程的各种特性。 多范式:①面向对象;②面向过程;③泛型;④函数式。 重点:scala运行在JVM上的,是面向对象函数式编程。scala运行在JVM上,需要先安装jdk。 java运行流程:程序...

一盏小灯的博客 924

初识Scala

官网: https://www.scala-lang.org/ key看出Scala有以下特点: 面向对象编程 函数式编程 一种高级别语言 基于JVM key很方便的调用Java类 工具类Java类 common-lang3 学习Scala对于后面学习Spark、Flink、Kfk等很有帮助 key跟其它语言互补,但是不一定就是说key代替其它语言 Scala版本目前大致有如下这些: ...

liweihope的博客 446

01-47-Scala-入门基础

scala-01-入门

qq_37171694的博客 218

Scala基础知识01

Scala是一门以Java的虚拟机(JVM)为运行环境,并将面向对象函数编程的结合在一起的静态的语言,(为啥静态呢,因为是先编译成.class文件,然后再JVM上再运行的),Scala也是一门多范式的编程语言,这是因为Scala支持面向对象也支持函数式的编程。 在cmd输入scala的黑窗口,我们称之为REPL,这个是四个单词的缩写Read->Evaluation->Print-&...

ylm2999的博客 304

Day001--Scala中的下载安装配置及下载安装集成开发环境IDEA

跟随这篇文章,让我们来下载scala,idea(集成开发环境),为后期的学习scala做好环境准备----------工欲善其事必先利其器。

干就完了 1293

Scala六大特性及常用知识点总结(一)

百度百科中对Scala这门语言的简介是这个样子:“Scala是一门多范式的编程语言,一种类似java的编程语言 ,设计初衷是实现可伸缩的语言 、并集成面向对象编程函数式编程的各种特性。” 作为一门基于JVM的编程语言,ScalaJava在很多方面有相似之处。 Scala官网总结了它的六大特性,翻译成中文它们分别对应着以下六点: 1).JavaScala可以混编: Scala基于JVM平台...

StandbyTheSea的博客 4754

scala_mark_001

最近今天开始研究scala, 由于本人一直从事的是java相关开发, 所以写一点感触学习

极e象 778

(一)Scala语言——入门

目录一、Scala 入门1. 概述1.1 为什么学习Scala2. Scala 发展历史3. Scala Java 关系4. Scala 语言特点Scala 环境搭建4. HelloWorld 案例4.1 IDEA环境创建4.2 Scala程序反编译4.3 开发注意事项5. 关联Scala源码6. 官方编程指南二、变量数据类型1. 注释3. 变量4. 字符串输出5. 键盘输入 一、Scala...

fseast的博客 4728

TwinCAT3以太网通讯测试-Client.rar

TwinCAT3以太网TCP/IP通讯测试1、PLC作为Client。2、测试程序。3、TC3的通讯软件库,安装在PLC系统上。4、操作说明教程。

上一篇: json 学习一
下一篇: JAVA 线程000
locklws
博客等级 码龄14年 87粉丝 40原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值