公式の Akka doc では、次のように断言しています。
アクターの可視性と並べ替えの問題を防ぐために、Akka は次の 2 つの「前に起こる」ルールを保証します。
アクター送信ルール: アクターへのメッセージの送信は、同じアクターによるメッセージの受信前に発生します。アクターの後続処理ルール: 1 つのメッセージの処理は、同じアクターによる次のメッセージの処理の前に行われます。
詳細については、ドキュメントを参照してください。
Akka がこれをどのように達成したのか疑問に思っています。ソースコードを調べたところ(現時点では最新)、実行前に Lock があるはずだと思いましたが、ロックActor.receive
が見つかりませんでした(と思います)。最後に、次のコメントを見つけましたActorCell.invoke
。
//メモリの一貫性はメールボックスによって処理されます (メールボックスのステータスを読み取り、メッセージを処理し、メールボックスのステータスを書き込みます)
ええ、Mailbox.status
これは私が探しているものだと思います。Unsafe
フィールドへのアクセス/更新に使用されているのを見ましたstatus
が、これによりメモリの可視性を確保する方法がわかりませんでした。