2010-03-17 10 views
13

El Modelo de Memoria Java (desde 1.5) trata los campos final de manera diferente a los campos que no son final. En particular, siempre que la referencia this no escape durante la construcción, escribe en final, los campos en el constructor están garantizados para ser visibles en otros hilos, incluso si el objeto está disponible para el otro hilo a través de una carrera de datos. (No se garantiza que los campos que no sean final sean visibles, por lo que si los publica incorrectamente, otro subproceso podría verlos en un estado parcialmente construido)Scala y el Modelo de Memoria Java

¿Existe documentación sobre cómo/si el compilador Scala crea final (en lugar de no final) campos de respaldo para las clases? Revisé las especificaciones del lenguaje y busqué en la web, pero no puedo encontrar ninguna respuesta definitiva. (En comparación, la anotación @scala.volatile es documentado para marcar un campo como volatile)

Respuesta

4

Cavé a través de la historia clínica para saber cuando se hizo el cambio.

La proyección de la Scala en la JVM no está cubierto por la especificación del lenguaje.

+7

Pero el comportamiento, desde una perspectiva de concurrencia, de construcciones de lenguaje debería ser parte de su especificación. ¡Yo argumentaría! –

3

Se crea un campo final cuando se declara algo como val. Cualquier cosa cuyas referencias se puedan modificar, como var, obviamente no puede ser final debajo.

Esto significa que case classes contienen campos finales también (como los argumentos a un constructor de la clase caso son implícitamente val s)

+1

No creo que este sea el caso (ver http://old.nabble.com/Val-and-Final-td13355515.html por ejemplo). Parte del motivo de mi pregunta: si esto puede cambiar sin documentación, ¿cómo sé que no volverá a cambiar? –

+1

Tiene razón en que debería haberse documentado. Esto no es solo un problema de rendimiento sino parte del lenguaje mismo debido al modelo de memoria. No sabía que vals solía ser no final –

2

He archivado un error de documentación para esto en el sistema Scala bug.

Cuestiones relacionadas