En Java, cuando se usa un objeto en varios hilos (y en general), es una buena práctica hacer campos finales. Por ejemplo,Scala final vs val para visibilidad de concurrencia
public class ShareMe {
private final MyObject obj;
public ShareMe(MyObject obj) {
this.obj = obj;
}
}
En este caso, la visibilidad de obj será consistente a través de múltiples hilos (Asumamos obj tiene todos los campos finales así), ya que se construye de manera segura usando la palabra clave final.
En scala, no parece val compila hasta una referencia final, sino val es semántica en scala que evita que reasigne una variable (Scala final variables in constructor). Si las variables del constructor scala no se definen como finales, ¿sufrirán el mismo problema (al usar estos objetos en los actores)?
gracias por esa aclaración. ¿Puedes ver mi actualización a esa pregunta? También veo las variables de constructor declaradas como finales (como se muestra en javap) para una clase que no sea de caso sin modificador. –
@retronym, llegué a su respuesta tratando de encontrar una respuesta a mi pregunta, [Inmutabilidad y seguridad de hilos en Scala] (http://stackoverflow.com/questions/32113124/immutability-and-thread-safety-in- scala). Como sabe, la palabra clave 'final' en Java también se utiliza para evitar la reubicación de las instrucciones del ctor, como se indica en [esto] (https://www.cs.umd.edu/~pugh/java/memoryModel /jsr-133-faq.html#finalRight) enlace. Entonces, si he entendido bien tu respuesta, usar un campo 'val' en una clase Scala equivale a declarar un campo' final' en una clase Java, ¿cómo funciona el JMM correctamente? –