Pregunta

En Scala, si tengo una clase simple de la siguiente manera:

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

¿Debería mi campo sum estar marcado @volatile ? Mientras que el actor es lógicamente de un solo subproceso (es decir, los mensajes se procesan secuencialmente), las reacciones individuales pueden estar ocurriendo en subprocesos separados y, por lo tanto, la variable state puede estar alterada en un hilo y luego leer de otro.

¿Fue útil?

Solución

No necesita marcarlos como volátiles. La ejecución de su código no está dentro de un bloque sincronizado, pero el actor siempre pasará a través de uno antes de que se invoque su código, forzando así la memoria a un estado consistente a través de los hilos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top