¿Deberían marcarse las propiedades de mis actores Scala @volatile?
-
06-07-2019 - |
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.
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