In Scala, wenn ich eine einfache Klasse wie folgt:Sollten die Eigenschaften meiner Scala-Darsteller @volatile sein?
val calc = actor {
var sum = 0
loop {
react {
case Add(n) =>
sum += n
case RequestSum =>
sender ! sum
}
}
}
Sollte mein Feld sum
@volatile
markiert werden? Während der Aktor logisch single-threaded ist (d. H. Die Nachrichten werden sequentiell verarbeitet), können die einzelnen Reaktionen auf separaten Threads stattfinden und daher kann die state
Variable in einem Thread geändert und dann von einem anderen gelesen werden.
Ist das keine signifikante Abweichung von Erlang? Es bedeutet, dass die Akteure hinsichtlich des Hinzufügens von Kernen nicht vollständig skalierbar sind - es sei denn, sie sind vollständig staatenlos. –
Und konnte das Darsteller-Framework den util.concurrent.Exchanger nicht verwenden, um den Status zwischen Threads zu übergeben? –
Wenn ein aktueller Wert von etwas nur in einem Register einer CPU ist und ein veralteter Wert in einem gemeinsam genutzten Cache oder RAM ist, ist es für eine andere CPU durchaus möglich, diesen veralteten Wert zu sehen. @volatile teilt der JVM mit, dass ein Update aktualisiert werden muss, bevor ein anderer Thread versucht, auf diesen Wert zuzugreifen (ok, ich vereinfache hier ...). Synchronisiert ebenfalls die JVM, um sicherzustellen, dass alle verschiedenen Speicherebenen in einem konsistenten Zustand sind. Dies ist ein universelles Problem im Umgang mit Multicore. –