2009-06-23 9 views
7

En Scala, si tengo una clase simple de la siguiente manera:¿Las propiedades de mis actores de Scala deben marcarse como @volatile?

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

caso de mi campo sum marcarse @volatile? Mientras que el actor es lógicamente de una sola hebra (es decir, los mensajes se procesan secuencialmente), las reacciones individuales pueden estar ocurriendo en hilos separados y, por lo tanto, la variable state puede estar siendo alterada en un hilo y luego leer desde otro.

Respuesta

6

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á por uno antes de que se invoque su código, forzando así a la memoria a un estado consistente a través de los hilos.

+0

¿No es esto una desviación significativa de Erlang entonces? Significa que los actores no son ni completamente escalables con respecto a la adición de núcleos, a menos que sean completamente apátridas. –

+0

¿Y el marco de actores no podría usar el utilit.concurrent.Exchange para transferir el estado entre subprocesos? –

+1

Si un valor actual de algo solo está en un registro de una CPU, y un valor obsoleto está en una caché o RAM compartida, entonces es completamente posible que otra CPU vea ese valor obsoleto. @volatile le dice a la JVM que cuando un valor se actualiza en un lugar, esa actualización debe posponerse antes de que otro hilo intente acceder a ese valor (vale, estoy simplificando aquí ...). Del mismo modo, sincronizado activa la JVM para asegurarse de que todos los diferentes niveles de memoria estén en un estado constante. Este es un problema universal cuando se trata de multinúcleo. –

Cuestiones relacionadas