Должны ли свойства моих актеров Scala быть помечены @volatile?
-
06-07-2019 - |
Вопрос
В Scala, если у меня есть простой класс следующим образом:
val calc = actor {
var sum = 0
loop {
react {
case Add(n) =>
sum += n
case RequestSum =>
sender ! sum
}
}
}
Должно ли мое поле sum
быть помечено как @volatile
? Хотя субъект является логически однопоточным (т.е. сообщения обрабатываются последовательно), отдельные реакции могут происходить в отдельных потоках, и, следовательно, переменная state
может быть изменена на один поток, а затем читать из другого.
Решение
Вам не нужно отмечать их как изменчивые. Выполнение вашего кода не находится внутри синхронизированного блока, но субъект всегда будет проходить через него перед тем, как будет вызван ваш код, что приводит к тому, что память переходит в согласованное состояние между потоками.
Не связан с StackOverflow