Должны ли свойства моих актеров Scala быть помечены @volatile? - PullRequest
7 голосов
/ 23 июня 2009

В Scala, если у меня есть простой класс следующим образом:

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

Должно ли мое поле sum быть помечено @volatile? Хотя субъект * логически однопоточный (т.е. сообщения обрабатываются последовательно), отдельные реакции могут происходить в отдельных потоках, и, следовательно, переменная state может быть изменена в одном потоке, а затем считана из другой.

1 Ответ

6 голосов
/ 23 июня 2009

Вам не нужно отмечать их как изменчивые. Выполнение вашего кода не находится внутри синхронизированного блока, но субъект всегда будет проходить через него до того, как будет вызван ваш код, что приводит к тому, что память переходит в согласованное состояние между потоками.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...