在官方的 Akka 文档中,他们否认:
为了防止 Actor 的可见性和重新排序问题,Akka 保证以下两个“发生在”规则:
演员发送规则:向演员发送消息发生在同一演员接收该消息之前。Actor 后续处理规则:一条消息的处理发生在同一 Actor 处理下一条消息之前。
请参考文档以获取详细信息。
我想知道 Akka 是如何做到这一点的。我刚刚浏览了源代码(此时最新),我认为在执行之前应该有一个 Lock Actor.receive
,但我没有找到任何锁(我认为)。最后,我找到了一条评论ActorCell.invoke
:
//内存一致性由邮箱处理(先读邮箱状态再处理消息,再写邮箱状态
是的Mailbox.status
,我想这就是我要找的。我看到他们Unsafe
用来访问/更新该status
字段,但我只是不知道这如何确保内存可见性。