Pergunta

Em Scala, se eu tiver uma aula simples da seguinte maneira:

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

Deveria meu campo sum ser marcado @volatile? Enquanto o ator é Logicamente um único thread (ou seja, as mensagens são processadas sequencialmente), as reações individuais podem estar acontecendo em threads separados e, portanto, o state A variável pode estar sendo alterada em um segmento e depois ler de outro.

Foi útil?

Solução

Você não precisa marcá -los como voláteis. A execução do seu código não está dentro de um bloco sincronizado, mas o ator sempre passará por um antes que seu código seja invocado, forçando assim a memória a um estado consistente entre os threads.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top