Scala和并发编程

Scala——基于Akka的并发编程和分布式应用程序开发 基于Akka分布式技术开发分布式应用程序,分为两个角色: 1、master 作用:接收worker的注册,并将worker的注册信息保存下来;感知worker的上下线;接收worker的汇报心跳,更新worker的相关信息; 定时检测超时的worker,并将超时的worker从集群中移除掉。 2、worker 作用:向master进行注册,加入到集群中去;定时向master汇报心跳。 阅读详情

 Scala语言有很多优点,比如简洁、强大的表现力等等。但我最关注的,是它在并发编程方面的优势。

 

  Scala通过强调对象的不变性 以及使用基于事件的模型进行线程间通信 使得实现并发应用变得简单。

 

  不变对象

  并发编程之所以这么困难,很大一个原因在于对象的可变性。要在充斥着大量可变对象的程序里面实现安全并发,需要非常繁琐以及复杂易错的同步操作来保证状态更新的同步。

 

  比如下面这段代码(java的例子),可能你会认为它已经是线程安全的了,因为所有的方法都已经被同步。

 

Java代码  收藏代码
  1. class Account {  
  2.     private int balance;  
  3.       
  4.     synchronized public int getBalance() {  
  5.       return balance;  
  6.     }  
  7.       
  8.     synchronized public void incrementBalance() {  
  9.       balance++;  
  10.     }  
  11. }  
 

  但是问题来了,当顺序调用这两个方法的时候,比如:

 

Java代码  收藏代码
  1. account.incrementBalance();  
  2. account.getBalance();  
 

  这时并不是线程安全的,在第一个方法调用结束之后,可能会被其它线程获取对象的锁,修改account的balance。

 

  在命令式编程语言里面,命令查询分离是一个普遍使用的原则。意即:一个方法要么进行一次命令(执行一个操作,通常会修改状态),要么进行一次查询(返回一些状态, 但并不修改状态),而不应该同时执行命令以及查询。从面向对象的角度看,这是一个良好的设计;但从并发编程的角度看,它却带来了一些问题,使得并发编程实现更加困难。上面就是一个很好的例子。

 

  要使得上面这段代码变得线程安全,可以通过破坏命令查询分离原则来实现:

 

Java代码  收藏代码
  1. synchronized public int incrementAndGetBalance() {  
  2.   balance++;  
  3.   return balance;  
  4. }  

 

  从上面的例子看到,在可变对象的环境中实现并发编程是困难的。而不变对象,意即线程安全的对象,使得我们不必担心共享对象会被多个线程同时修改而无法保持它的正确性:因为它本身就不可修改。我们可以把不变对象很放心地扔到多线程环境中,任意使用。

 

  问题又来了,如果要“修改状态”怎么办?很简单,创建一个新的对象。还是上面那个例子,我们把它修改成一个Scala的不变对象类。并在伴生对象里面实现increment方法,此方法会返回一个新的account对象,balance值为原有对象的值加1所得。

 

Java代码  收藏代码
  1. class Account (val balance: Integer) {  
  2.   def getBalance() = balance  
  3. }  
  4.   
  5. object Account {  
  6.   def increment(account: Account): Account {  
  7.     new Account(account.getBalance() + 1)  
  8.   }  
  9. }  

 

 通过强调不变对象的使用,并发编程变得简单了很多。

 

 Actor

 传统的并发是通过线程(thread)来实现的。在传统的并发模型中,程序被分成若干份同时执行的任务,并且所有任务都对一块共享的内存进行操作。在传统的并发模型会引起竞争问题,可以采取锁机制避免竞争问题,但同时这可能带来死锁等问题。

 

 Actor模型是另一种不同的并发模型,它很好地解决了在传统并发模型中竞争和死锁等问题。我们可以把一个由actor模型实现的并发程序看成是一个星系一样,星系里面有很多星球,每个星球都是一个actor,星球之间不共享任何资源,但是它们之间有通道来相互传递信息。

 

 每个星球(actor)都有一个信箱来接受来自其它星球的任意信息,它会按照信息接收的顺序来处理,处理完一个信息然后接着处理下一个信息。可以按照信息类型来触发不同的行为。

 

 同时,每个星球(actor)可以异步地(也可以同步,但不是这里谈论的重点)向其它任意星球发送任意消息,就是说,它发送消息之后不会等待返回信息而是直接执行接下来的操作。

 

  下面是一个Actor的例子:

 

Java代码  收藏代码
  1. import scala.actors.Actor  
  2. import scala.actors.Actor._  
  3.    
  4. case class Increment(amount: Int)  
  5. case class Balance  
  6.    
  7. class Account extends Actor {  
  8.     var balance: Int = 0;  
  9.    
  10.     def act() = {  
  11.         while (true) {  
  12.             receive {  
  13.                 case Increment(amount) =>  
  14.                     balance += amount  
  15.                 case Balance =>  
  16.                     println("Balance is " + balance)  
  17.                     exit()  
  18.             }  
  19.         }  
  20.     }  
  21. }  

 

  我们可以看到,程序里面定义两种不同的消息类型:Increment和Balance。Account是一个Actor,它跟外界的交互都是通过消息传递来实现:不论是increment,还是获取balance都是通过消息的方式来实现。当接受到不同的消息时,它会执行不同的行为。

 

  我们也可以看到,Account的内部状态完全是自己控制的,接收到的消息是顺序执行的,所以我们不需要担心竞争问题。

 小结

  Scala就是这样,通过“使用基于事件的模型进行线程间通信”,并且“把不变对象作为消息进行传递”来实现一个并发编程模型。

 

--EOF--

Scala语言的并发编程 Scala提供的并发编程工具和模型使得在现代软件开发中处理并发任务变得更加高效和安全。无论是通过传统的线程模型,还是采用更为先进的Future和Akka Actor,Scala都能为开发者提供灵活的解决方案。并发编程的挑战在于如何高效、安全地处理共享资源,而Scala语言的设计理念能较好地应对这些挑战。通过学习和应用Scala的并发编程特性,开发者可以编写出更加高效和健壮的应用程序。希望本文所提供的内容能够帮助读者在Scala的并发编程领域深入理解并应用这一强大技术。 阅读详情

相关推荐

7、Scala 并发编程与数据库交互:Futures 和 SQL 基础

本文深入探讨了Scala在并发编程和数据库交互方面的核心技术,涵盖并行集合、Futures的使用场景与组合、执行上下文控制以及与SQL数据库的连接与异常处理。通过实际代码示例,展示了如何利用Scala实现高效的并行计算、异步I/O操作和可靠的数据库操作,适用于数据科学与大规模应用开发。

mars5的博客 57

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

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

weixin_33937778的博客 440

scala并发编程开发教程

Spark 的RPC是通过Akka类库实现的,Akka用Scala语言开发,基于Actor并发模型实现

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

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

locklws的专栏 750

概率论基础-严士健 第二版 习题与补充1.6答案

概率论基础-严士健 第二版 习题与补充1.6答案 1.不独立。 设有一均匀正八面体,其第1,2,3,4面染红色,第1,2,3,5面染白色,第1,6,7,8面染黑色,现在以A,B,C分别表示投一次正八面体出现红、白、黑的事件,则 P(A)=P(B)=P(C)=12.P(A) = P(B) = P(C) = \frac{1}{2}.P(A)=P(B)=P(C)=21​. P(ABC)=18=P(A)P...

weixin_42341993的博客 2516

硅纪元应用测评 | AI搜索引擎大比拼:360AI搜索、秘塔搜索、GenSpark AI和天工AI对比评测

搜索引擎输出的每个段落都有对应的出处,如果有错误,也是信息源的问题,从普通用户的角度来看,这与AI搜索的产品关系不大,能让用户对AI搜索的服务和得到的信息有一个隔离。同时,提供更多的定制选项,允许用户根据自己的偏好调整搜索结果的权重和排序,将使得搜索体验更加个性化和满足用户的具体需求。此外,大部分搜索工具还提供了一个无广告的搜索环境(360AI搜索部分内容会有广告),极大地提升了用户的搜索体验。AI搜索的本质依然是搜索,但它通过AI的逻辑分析和语言重新组织,使用户能够快速得到想要的信息。

guijiyuantech的博客 2015

scala并发_深入研究Scala并发

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

cusi77914的博客 850

【硬核指南/MI50 32G/Ubuntu】从零部署大模型:MI50显卡Ubuntu系统驱动安装与避坑全记录

本文详细记录了在Ubuntu系统上为AMD MI50显卡安装驱动并部署大模型的完整流程,包括硬件兼容性检查、BIOS关键设置、系统安装优化、ROCm驱动安装及常见问题解决方案。特别针对MI50显卡在X99平台上的特殊配置需求提供了实用技巧,帮助用户避免常见陷阱,提升大模型训练效率。

weixin_42520909的博客 813

scala系列--并发01

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

独立开发,substack顶级编辑 1806

计算机组成原理实验:手把手教你用模拟程序实现中断机制(附完整代码)

本文通过一个计算机组成原理模拟实验,手把手教你从零实现一个可工作的中断系统。实验详细演示了如何配置中断控制器、编写主程序与中断服务程序,并观察中断响应、现场保护和恢复的全过程,深入解析了中断原理的核心机制。

474

frp内网穿透(socks隧道)

在实验过程中还是遇到了挺多的问题,但好在大多都解决了。不过还是遗留了一些不懂的问题,等以后再慢慢研究了。最后,以上仅为个人的拙见,如何有不对的地方,欢迎各位师傅指正与补充,有兴趣的师傅可以一起交流学习。

2301_76227305的博客 1万+

并发编程:使用Scala Future和Akka实现并发处理

并发编程是一种编程范式,它允许多个计算过程在重叠时间段内执行。它不同于串行编程,后者一次只执行一个计算过程。并发编程可以提高程序的性能,尤其是在多核处理器上,因为它可以更有效地利用计算资源。Akka是一个用于构建并发、分布式和弹性消息驱动应用程序的工具包和运行时。它基于Actor模型,提供了高效的并发处理能力。Akka Streams是基于Akka Actor的一个模块,用于处理流数据。它提供了高效、响应式的流处理能力,适用于处理大规模数据流。

weixin_41859354的博客 1464

遥感常用相关指数和计算方法(植被指数/水体指数/雪和冰指数/矿物指数/地表温度指数/云和阴影指数/农业指数)

遥感常用相关指数和计算方法(植被指数/水体指数/雪和冰指数/矿物指数/地表温度指数/云和阴影指数/农业指数)

m0_64361769的博客 1万+

Scala隐式转化和并发编程

1.Scala隐式彻底详解 隐式转换 implicit ,可通过手动指定将某种类型的对象或者某种类转换成其他类型的类或者对象 形式:implicit def function 隐式函数、隐式参数、隐式对象、隐式类隐式函数:指有implicit前置修饰的函数 Scala会根据上下文,利用隐式转换函数的签名主要是输入类型,在程序运行时利用隐式转换函数,将接受的隐式函数参数类型定义的对象自动升级转

sundujing的博客 5185

基于opencv的鱼群检测和数量统计识别鱼群密度带界面

摘要:本项目利用OpenCV图像处理技术实现了视频鱼类自动检测计数系统。通过背景减除、形态学处理和轮廓检测等方法,在视频帧中标记鱼类并统计数量。系统包含视频读取、前景提取、轮廓分析、中心点跟踪等核心功能,可实时显示计数结果。适用于水产养殖、生态监测等领域,具有实用价值。未来可通过参数优化、引入深度学习和多目标跟踪技术进一步提升准确性。(147字)

1724

Onnxruntime之YOLOP部署过程记录

魔改YoloP部署过程记录

如果想成为中心,那么就到中心去吧。 1930

Scala隐式转换和并发编程笔记

一、Scala隐式转换 (一)隐式转换函数 //上下文中定义了隐式转换函数 scala> class Person(val name:String) defined class Person scala> class Engineer(val name:String, val salary:Double){ | def code = println("Coding .....

weixin_41074929的博客 191

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

day5:Scala隐式转换和并发编程

本文内容整理来源于大数据梦工厂:

zhanglin200508的专栏 270

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Spark3000门徒第五课scala隐式转换和并发编程总结

今晚听了王家林老师的Spark 3000门徒系列第五课scala隐式转换和并发编程,课后作业是:分析DAGScheduler Master Worker RDD源码中隐式转换和Actor并发编程,我的见解如下: 隐式函数,隐式参数最常见,隐式对象和隐式类少见 RDD中方法: def distinct(numPartitions: Int)(implicit ord: Orderin...

Tony991524的博客 163

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Scala 并发编程之react和loop

Scala 并发编程之react及loop介绍。

残缺的孤独 2305

Scala 并行和并发编程-Futures 和 Promises【翻译】

官网地址 本文内容 简介 Futures 阻塞 异常 Promises 工具 最近看了《七周七语言:理解多种编程泛型》,介绍了七种语言(四种编程范型)的主要特性:基本语法,集合,并行/并发,其中就有 Scala。你不能指望这种书全面介绍,因为其中任何一门语言都够写一本书了~ 我比较关注并行/并发,但是书中关于 Scala 的并发部分——Actor,可代码编译不通过,官网标注“De...

weixin_33858485的博客 501

Scala 并行和并发编程-Futures 和 Promises

最近看了《七周七语言:理解多种编程泛型》,介绍了七种语言(四种编程泛型)的主要特性:基本语法,集合,并行/并发,其中就有 Scala。你不能指望这种书全面介绍,因为其中任何一门语言都够写一本书了~ 我比较关注并行/并发,但是书中关于 Scala 的并发部分——Actor,代码编译不通过,“Deprecated”,哎,这书点不负责,代码也不写采用编译器的版本。于是就到 Scala 官网看了一下

python的博客 1223

第五课:彻底精通Scala隐式转换和并发编程及Spark源码阅读

彻底精通Scala隐式转换和并发编程及Spark源码阅读

aijiudu的博客 713

Scala(第五节)actor并发编程、文件操作和网络请求、隐式转换和隐式参数、Akka并发编程、Akka模拟简易Spark通信

目录actor并发编程什么是Scala Actor概念java并发编程与Scala Actor编程的区别Actor的执行顺序发送消息的方式Actor实战第一个例子第二个例子第三个例子第四个例子第五个例子通过actor实现多文件单词计数scala当中的文件操作和网络请求读取文件当中每一行的数据读取词法单元和数字读取网络资源、文件写入、控制台操作读取网络资源文件写入操作控制台交互操作scala当中的序列化scala当中的正则表达式隐式转换和隐式参数隐式转换隐式参数隐式转换方法作用域与导入隐式转换的时机隐式转换

hwq317622817的博客 427
上一篇: HttpClient
下一篇: 抽象类没抽象方法的例子
fancylovejava
博客等级 码龄16年 1052粉丝 184原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值