Frage

In Scala, wenn ich eine einfache Klasse wie folgt habe:

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

Sollte mein Feld sum markiert sein @volatile? Während der Schauspieler ist Logisch einzeln (dh die Nachrichten werden nacheinander verarbeitet), die individuellen Reaktionen können auf getrennten Threads und damit der state Variable kann in einem Thread geändert und dann von einem anderen gelesen werden.

War es hilfreich?

Lösung

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top