2009-06-23 9 views
7

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.

Antwort

6

Sie müssen sie nicht als flüchtig markieren. Die Ausführung Ihres Codes befindet sich nicht in einem synchronisierten Block, aber der Aktor wird immer einen Code durchlaufen, bevor der Code aufgerufen wird, wodurch der Speicher in Threads in einen konsistenten Zustand gezwungen wird.

+0

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. –

+0

Und konnte das Darsteller-Framework den util.concurrent.Exchanger nicht verwenden, um den Status zwischen Threads zu übergeben? –

+1

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. –