2012-04-15 9 views
8

Questa domanda è simile a Should my Scala actors' properties be marked @volatile? ma non è sicuro che la risposta sarà la stessa.Le proprietà dei miei attori Akka devono essere contrassegnate come @volatile?

Ad esempio, quando il configuratore fork-join è stato configurato e lo stato dell'attore non è stato contrassegnato da @volatile, è garantito che lo stato dell'attore verrà propagato attraverso la gerarchia della cache da un core (o processore) a un altro se i thread di lavoro fork/join vengono eseguiti su core (o processori) diversi?

P.S. È giusto che dopo JSR133 sia necessaria solo un'operazione di scrittura/lettura a/da qualsiasi variabile volatile necessaria per svuotare la cache nella memoria principale e vedere tutti i precedenti scritti non volatili da questo thread su altri thread che girano su un altro core (o processore)? Se sì, può essere una risposta, poiché la scansione della coda di lavoro esegue alcune letture e scritture da/a variabili volatili dell'attività FJ.

risposta

4

No, non si dovrebbe mettere volatile sui campi degli attori. Perché?

se un attore apporta modifiche al suo stato interno durante l'elaborazione di un messaggio , e accede quello stato durante l'elaborazione di un altro messaggio istanti dopo. È importante rendersi conto che con il modello di attore non si ha alcuna garanzia che lo stesso thread eseguirà lo stesso attore per diversi messaggi.

E 'tutto qui: http://doc.akka.io/docs/akka/2.0/general/jmm.html

quanto riguarda il tuo PS, è necessario leggere/scrivere sullo stesso campo volatile per ottenere la garanzia che accade-prima. Leggi su "volatile piggybacking"