Должны ли свойства моих актеров Scala быть помечены @volatile?

StackOverflow https://stackoverflow.com/questions/1031167

Вопрос

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

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

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

Это было полезно?

Решение

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top