В официальном документе Akka они отказываются:
Чтобы предотвратить проблемы с видимостью и переупорядочением на актеров, Akka гарантирует следующие два правила "произойдет до":
Правило отправки актера: передача сообщения актеру происходит до получения этого сообщения одним и тем же актером. Актер следующее правило обработки: обработка одного сообщения происходит до обработка следующего сообщения тем же актером.
Подробнее doc.
Мне интересно, как это делает Akka. Я только что просмотрел исходный код (последний в данный момент), и я думал, что перед выполнением Actor.receive
должен быть Lock, но я не нашел блокировок (я думаю). Наконец, я нашел комментарий для ActorCell.invoke
:
//Консистенция памяти обрабатывается почтовым ящиком (чтение почтового ящика статус, затем обрабатывать сообщения, а затем записывать статус почтового ящика
Да, Mailbox.status
, я думаю, это то, что я ищу. Я видел, что они использовали Unsafe
для доступа/обновления поля status
, но я просто не мог понять, как это может обеспечить видимость памяти.