首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Akka是如何在关系发生之前实现JMM的?

Akka是如何在关系发生之前实现JMM的?
EN

Stack Overflow用户
提问于 2013-04-06 09:48:28
回答 1查看 796关注 0票数 10

在官方的Akka doc中,他们否认:

为了防止行为者的可见性和重新排序问题,Akka保证以下两个“在”规则之前发生: 参与者发送规则:向参与者发送消息发生在同一参与者接收该消息之前。参与者后续处理规则:在同一参与者处理下一条消息之前对一条消息进行处理。

详情请参考the doc

我想知道Akka是怎么做到的。我刚刚查看了源代码(目前最晚),我认为在执行Actor.receive之前应该有一个锁,但是我没有找到任何锁(我认为)。最后,我为ActorCell.invoke找到了一条评论

//内存一致性由邮箱处理(读取邮箱状态,处理邮件,然后写入邮箱状态)

是的,Mailbox.status,我想这就是我要找的。我看到他们使用Unsafe访问/更新status字段,但我不知道如何确保内存的可见性。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-04-06 13:49:33

有两件事需要考虑:传递消息和正确发布参与者的内部状态。

前者是通过邮箱的MessageQueue实现实现的,它将使用易失性写入(对于默认的ConcurrentLinkedQueue)或锁(对于普通的LinkedBlockingQueue)来确保安全地发布已排队的项。参与者将通过读取相同的易失性字段(在第一种情况下)或采用相同的锁(在第二种情况下)来与发送者同步,因此在消息发送发生之前,所有写操作都会在处理该消息时在该参与者内部的任何内容之前进行。

即使根据您发现的邮箱状态重新调度到另一个线程上,也可以安全地保存该参与者的内部状态:在处理一批消息(由throughput参数定义)之后,邮箱被设置为“非计划”状态,这是一种易失性写入(实际上是Unsafe.compareAndSetInt(),语义相同)。在参与者开始处理消息之前,它使用Unsafe.getIntVolatile读取邮箱状态,该状态与上一次写入同步,因此在发生最后一批消息期间由参与者完成的所有写入操作都会在此批处理期间进行。

您可以更多地了解涉及here的操作的语义,请记住,sun.misc.Unsafe上的*Volatile方法遵循与Atomic*Reference相同的规则。

票数 16
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15849366

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档