Nel documento ufficiale Akka, si declinano:In che modo Akka implementa la relazione "prima-prima" di tipo JMM?
Per evitare problemi di visibilità e di riordino su attori, Akka garantisce le seguenti due "avviene prima" regole:
L'attore inviare regola: l'invio del messaggio a un attore avviene prima che il messaggio venga ricevuto dallo stesso attore. Regola di elaborazione successiva dell'attore : l'elaborazione di un messaggio avviene prima dell'elaborazione del messaggio successivo da parte dello stesso attore prima del .
Si prega di riferimento the doc per i dettagli.
Mi chiedo come fa Akka a farlo. Ho appena passato il codice sorgente (l'ultimo in questo momento) e ho pensato che ci fosse un blocco prima di eseguire Actor.receive
, ma non ho trovato nessun blocco (credo). Infine, ho trovato un commento per ActorCell.invoke
:
// coerenza della memoria è gestita dal Mailbox (lettura dello stato della cassetta postale poi l'elaborazione dei messaggi, quindi scrivendo stato di casella di posta
Sì, il Mailbox.status
, immagino Ho visto che usano Unsafe
per accedere/aggiornare il campo status
, ma non riuscivo a capire come questo possa garantire la visibilità della memoria
Gli stati interni di questo attore medio sono protetti da Mailbox.status? –
sì, precisamente. –
Grazie, Roland! Ispezionando AbstractQueuedSynchronizer, lo capisco finalmente. –