演员(scala / akka):是否暗示接收方法将以线程安全的方式访问?

11

我假设消息会被以线程安全的方式接收和处理。但是,我已经阅读了一些akka/scala文档,但还没有遇到“线程安全”这个关键词。

3个回答

21
这可能是因为演员模型假定每个演员实例都按顺序处理其自己的邮箱。这意味着不应该发生两个或多个并发线程执行单个演员实例代码的情况。从技术上讲,您可以在演员类中创建一个方法(因为它仍然是一个对象),并从多个线程同时调用它,但这将是违反演员使用规则的重大偏离,并且您将“自担风险”,因为然后您将失去该模型的所有线程安全保证。
这也是Akka引入ActorRef概念的原因之一-它是一个句柄,可让您通过消息传递与演员通信,而不是直接调用其方法。

谢谢Przemek。这解释了很多。 - Asad Iqbal

5

我已经多次阅读了那份文档。作为一个JVM新手,在我的理解中,“happens before”只能证明“可见性”。我们仍然可能会因为多个线程进入临界区而出现问题。 - Asad Iqbal
4
Akka 通过仅允许邮箱被安排一次执行来防止同一演员的消息同时执行。 (要么安排执行,要么不执行)。 通过使邮箱可运行,我们不仅避免了分配新的可运行内容,而且还可以通过简单的 CAS 操作确保邮箱只被安排执行一次,这意味着不需要额外的簿记来确保 2 个线程不同时处理同一个邮箱。 - Viktor Klang
很棒的解释。这肯定会在我以后的阅读中帮到我。不过有一个问题,我该如何从http://akka.io/docs/akka/1.2/general/jmm.html 推断出邮箱的“互斥处理”呢? - Asad Iqbal
1
如果Akka Actors允许多次执行,那么它们就不会成为演员了;-) - Viktor Klang

2
演员是“Treadsafe”的。Actor系统(AKKA)为每个actor提供了自己的“轻量级线程”。这意味着这不是一个线程,但是AKKA系统将给开发人员留下一个Actor总是在其自己的线程中运行的印象。这意味着作为对消息操作的结果执行的任何操作,在所有目的上都是线程安全的。
然而,你不应该通过使用可变消息或公共状态来削弱AKKA。如果您将演员开发为独立的功能单元,则它们将是线程安全的。
另请参见: http://doc.akka.io/docs/akka/2.3.12/general/actors.html#State 以及 http://doc.akka.io/docs/akka/2.3.12/general/jmm.html,更深入地研究AKKA内存模型及其如何管理“线程”问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接