Actors(scala/akka):是否暗示将以线程安全的方式访问receive方法?

Asa*_*bal 11 scala thread-safety actor akka

我假设将以线程安全的方式接收和处理消息.但是,我一直在阅读(一些)akka/scala文档,但我还没有遇到关键字'threadsafe'.

Prz*_*wka 21

这可能是因为actor模型假定每个actor实例按顺序处理自己的邮箱.这意味着它永远不会发生,两个或多个并发线程执行单个actor实例的代码.从技术上讲,你可以在一个actor的类中创建一个方法(因为它仍然是一个对象)并同时从多个线程调用它,但这将与actor的使用规则有很大的不同,你可以"自担风险",因为那样你就会失去该模型的所有线程安全保证.

这也是其中一个原因,为什么Akka引入了ActorRef的概念- 一个句柄,它允许你通过消息传递与actor通信,但不是通过直接调用它的方法.


Vik*_*ang 5

我认为我们有很好的记录:http://doc.akka.io/docs/akka/2.3.9/general/jmm.html

  • Akka通过仅允许邮箱被安排执行一次来防止同时为同一个actor执行消息.(要么计划执行,要么不执行).通过使Mailbox Runnable不仅可以避免分配新的runnable,而且我们还可以通过简单的CAS操作确保邮箱只安排执行一次,这意味着不需要额外的簿记来确保2线程不会同时处理同一个邮箱. (4认同)