2009-06-23 10 views
7

In Scala, se ho una semplice classe come segue:Le proprietà dei miei attori Scala devono essere contrassegnate come @volatile?

val calc = actor { 
    var sum = 0 
    loop { 
    react { 
     case Add(n) => 
     sum += n 
     case RequestSum => 
     sender ! sum 
    } 
    } 
} 

caso mio campo sum essere contrassegnati @volatile? Mentre l'attore è logicamente single-threaded (ovvero i messaggi vengono elaborati in sequenza), le singole reazioni possono verificarsi su thread separati e quindi la variabile state può essere modificata su un thread e quindi letta da un altro.

risposta

6

Non è necessario contrassegnarli come volatili. L'esecuzione del tuo codice non è all'interno di un blocco sincronizzato, ma l'attore ne passerà sempre uno prima che il tuo codice venga richiamato, forzando così la memoria in uno stato coerente attraverso i thread.

+0

Non è forse una partenza significativa da Erlang? Significa che gli attori non sono né completamente scalabili rispetto all'aggiunta di core, a meno che non siano completamente apolidi. –

+0

E il framework degli attori non poteva utilizzare util.concurrent.Exchanger per passare lo stato tra i thread? –

+1

Se un valore corrente di qualcosa si trova solo in un registro di una CPU e un valore scaduto si trova in una cache condivisa o in una RAM, allora è completamente possibile per un'altra CPU vedere quel valore stantio. @volatile dice alla JVM che quando un valore viene aggiornato in un posto, quell'aggiornamento deve propogare prima che un altro thread provi ad accedere a quel valore (ok, sto semplificando qui ...). Allo stesso modo, i trigger sincronizzati della JVM assicurano che tutti i diversi livelli di memoria siano in uno stato coerente. Questo è un problema universale quando si ha a che fare con il multicore. –