Java并发 -- Actor模型
Actor模型
- Actor模型在本质上是一种计算模型,基本的计算单元称为Actor,在Actor模型中,所有的计算都在Actor中执行
- 在面向对象编程里,一切都是对象,在Actor模型里,一切都是Actor,并且Actor之间是完全隔离的,不会共享任何变量
- Java本身并不支持Actor模型,如果需要在Java里使用Actor模型,需要借助第三方类库,比较完备的是Akka
Hello Actor
1 | public class HelloActor extends UntypedAbstractActor { |
消息 VS 对象方法
- Actor模型是完全异步的,而对象方法调用是同步的
- Actor内部的工作模式可类比成_只有一个消费者线程的生产者-消费者模式_
- 在Actor模型中,发送消息仅仅是把消息发生出去而已,接收消息的Actor在接收到消息后,也不会立马处理
- 并发计算 + 分布式计算
- 调用对象方法,需要持有对象的引用,并且所有的对象都必须在同一个进程中
- 在Actor中发送消息,只需要知道对方的地址即可
- 发送消息和接收消息的Actor可以不在一个进程中,也可以不在同一台机器上
- 因此Actor模型不但适用于并发计算,也适用于分布式计算
Actor的规范定义
- Actor是一种基础的计算单元,具体来讲包括三部分能力
- 处理能力:处理接收到的消息
- 存储能力:Actor可以存储自己的内部状态,并且内部状态在不同Actor之间是绝对隔绝的
- 通信能力:Actor可以和其它Actor之间通信
- 当一个Actor接收到一条消息后,该Actor可以执行三种操作
- 创建更多的Actor
- 最终会呈现出一个树状结构
- 发消息给其它Actor
- 确定如何处理下一条消息
- Actor具备存储能力,有自己的内部状态,可以将Actor看作一个_状态机_
- 可以把Actor处理消息看作触发状态机的状态变化
- 在Actor模型里,由于是单线程处理的,所以在确定下一条消息如何处理是不存在竟态条件问题的
- 创建更多的Actor
累加器
1 | public class CounterActor extends UntypedAbstractActor { |
小结
- Actor模型是异步模型
- 不保证消息百分百送达
- 不保证消息送达的顺序与发送的顺序是一致的
- 不保证消息会被百分百处理
- 实现Actor模型的厂商都在尝试解决上面三个问题,但解决得并不完美,所以使用Actor模型是有成本的
参考资料
All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.