Java 并发编程实战
王宝令
资深架构师
72486 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 51 讲
学习攻略 (1讲)
Java 并发编程实战
15
15
1.0x
00:00/00:00
登录|注册

42 | Actor模型:面向对象原生的并发模型

无法保证消息会被百分百处理
不保证消息送达的顺序和发送的顺序一致
不保证消息百分百送达
系统由对象构成,对象之间通过消息通信
Actor是最基本的计算单元
确定如何处理下一条消息
发消息给其他Actor
创建更多的Actor
通信能力
存储能力
处理能力
适用于分布式计算
调用方会一直等待返回
消息先放到邮箱中,不会立即处理
需要借助第三方类库,如Akka
解决并发问题的利器
不共享任何变量
所有的计算都是在Actor中执行的
Actor模型和现实世界一样都是异步模型
Actor与面向对象编程中的对象匹配度高
Actor模型是一种非常简单的计算模型
线程安全的累加器
CounterActor内部持有累计值counter
Actor接收消息后可以
Actor具备三部分能力
发送消息和接收消息的Actor可以不在一个进程中,也可以不在同一台机器上
对象方法是同步的
消息机制是异步的
Java语言本身并不支持Actor模型
Actor模型是一种并发计算模型
Actor之间是完全隔离的
Actor模型本质是一种计算模型
总结
用Actor实现累加器
Actor的规范化定义
消息和对象方法的区别
Hello Actor模型
Actor模型:面向对象原生的并发模型
参考文章

该思维导图由 AI 生成,仅供参考

上学的时候,有门计算机专业课叫做面向对象编程,学这门课的时候有个问题困扰了我很久,按照面向对象编程的理论,对象之间通信需要依靠消息,而实际上,像 C++、Java 这些面向对象的语言,对象之间通信,依靠的是对象方法。对象方法和过程语言里的函数本质上没有区别,有入参、有出参,思维方式很相似,使用起来都很简单。那面向对象理论里的消息是否就等价于面向对象语言里的对象方法呢?很长一段时间里,我都以为对象方法是面向对象理论中消息的一种实现,直到接触到 Actor 模型,才明白消息压根不是这个实现法。

Hello Actor 模型

Actor 模型本质上是一种计算模型,基本的计算单元称为 Actor,换言之,在 Actor 模型中,所有的计算都是在 Actor 中执行的。在面向对象编程里面,一切都是对象;在 Actor 模型里,一切都是 Actor,并且 Actor 之间是完全隔离的,不会共享任何变量。
当看到“不共享任何变量”的时候,相信你一定会眼前一亮,并发问题的根源就在于共享变量,而 Actor 模型中 Actor 之间不共享变量,那用 Actor 模型解决并发问题,一定是相当顺手。的确是这样,所以很多人就把 Actor 模型定义为一种并发计算模型其实 Actor 模型早在 1973 年就被提出来了,只是直到最近几年才被广泛关注,一个主要原因就在于它是解决并发问题的利器,而最近几年随着多核处理器的发展,并发问题被推到了风口浪尖上。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

Actor模型是一种面向对象的并发模型,它将计算抽象为基本的计算单元Actor,并且在Actor模型中,所有的计算都是在Actor中执行的。与面向对象编程相比,Actor模型中的通信完全遵守消息机制,而不是通过对象方法来实现对象之间的通信。在Actor模型中,消息机制是异步的,而对象方法调用是同步的,这是它们的主要区别之一。此外,Actor模型不仅适用于并发计算,还适用于分布式计算,因为Actor之间的通信可以跨进程、跨机器进行。Actor具备处理能力、存储能力和通信能力,它们可以创建更多的Actor、发送消息给其他Actor,以及确定如何处理下一条消息。通过一个累加器的示例,演示了如何使用Actor模型实现线程安全的并发操作,而不需要使用锁或CAS。总的来说,Actor模型是一种简单而高效的计算模型,它与现实世界的组织结构和异步模型有着相似之处。在Java领域,可以使用Akka或Vert.x来支持Actor模型,它们都提供了良好的支持和实现。 Actor模型虽然有一些问题,比如消息的百分百送达和处理无法保证,但它仍然是一种非常有用的并发模型。 Actor模型的特点和优势使得它成为解决并发问题的利器,尤其是在多核处理器的发展下,它受到了越来越多的关注。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Java 并发编程实战》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(31)

  • 最新
  • 精选
  • QQ怪
    老师,actor模式具体实现的产品有哪些?想知道这些更加理解actor

    作者回复: spark,flink,play应该都用到了,我也不会scala,如果想深入理解只能先把scala学了😂😂

    2019-06-04
    2
    28
  • aoe
    感兴趣的可以看看《响应式架构 消息模式Actor实现与Scala.Akka应用集成》

    作者回复: 这本书也不错

    2019-11-22
    2
    16
  • 兔斯基
    这种并发模型现实应用多么?系统往往很少有可以接受丢失消息的吧?

    作者回复: 线程池也一样会丢数据,现在基本上都是靠数据库,mq这些支持事务的存储来搞定安全的异步处理

    2019-06-04
    4
    15
  • stg609
    虽然一个actor 是不会有并发问题,但要是同时发给多个actor去处理呢,每个actor 都可能访问同一数据库或者redis 这种共享资源,那还是有并发问题吧

    作者回复: 是的

    2020-05-07
    12
  • DFighting
    Actor读起来好像流数据处理模型中的Operator,不过Flink解决一致性语义(exactly-once)使用的是轻量级一致性快照,即在每个节点内部缓存当前整个系统执行到何处的状态,不过代价就是需要在计算拓扑中传递状态,算是一种内存换一致性吧,不过现在存储愈发可得,这个代价应该也是可以接受的。

    作者回复: 👍

    2019-10-16
    7
  • 晓杰
    请问老师actor模型的效率是不是会比较低

    作者回复: 不会

    2019-06-05
    3
    5
  • 张三丰
    很长一段时间里,我都以为对象方法是面向对象理论中消息的一种实现,直到接触到 Actor 模型,才明白消息压根不是这个实现法。 老师是认为面向对象调用方法不叫消息?那么面向对象调用方法这种数据传递方式叫什么?

    作者回复: 方法参数😂

    2019-10-14
    2
  • 老师怎么把actor用在实际开发中,在spring boot中集成

    作者回复: 我没有这样搞过,集成的太多坑就多,不过查了一下,还真有人这样搞过,还是建议慎重选择。 https://github.com/aliakh/demo-akka-spring

    2022-07-29归属地:北京
    1
  • cricket1981
    "也不保证消息送达的顺序和发送的顺序是一致的" …… 想问下什么情况下会发生这种情形?MailBox不是类似Queue一样FIFO结构吗?

    作者回复: 理论模型没这要求,并发情况下严格实现fifo很影响性能

    2019-06-05
    1
  • 潭州太守
    请问老师,Actor是不是不适合低延迟场景,或者有没有策略保证低延迟。

    作者回复: 也不是,erlang就有这方面的应用

    2019-06-04
    1
收起评论
显示
设置
留言
31
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部