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.
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. –
E il framework degli attori non poteva utilizzare util.concurrent.Exchanger per passare lo stato tra i thread? –
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. –