¿Alguien puede decirme si esta clase es segura o no?concurrencia de Java: ¿es el campo final (inicializado en el constructor) seguro para subprocesos?
class Foo {
private final Map<String,String> aMap;
public Foo() {
aMap = new HashMap<String, String>();
aMap.put("1", "a");
aMap.put("2", "b");
aMap.put("3", "c");
}
public String get(String key) {
return aMap.get(key);
}
}
Editar: Es mi culpa no aclarar la pregunta. De acuerdo con JMM FAQ:
una nueva garantía de la seguridad de inicialización debe ser prestado. Si un objeto está construido correctamente (lo que significa que las referencias a él no se escapan durante la construcción), todos los hilos que ven una referencia a ese objeto también verán los valores para sus campos finales que se establecieron en el constructor, sin la necesidad de sincronización.
Esto me hizo confundir que el conjunto en aMap es aMap = new HashMap<String, String>();
. Para que otros hilos puedan ver estos
aMap.put("1", "a");
aMap.put("2", "b");
aMap.put("3", "c");
¿o no?
Edit: encontraron esta question que cierra exactamente a mi pregunta
Lo es, pero la presencia de la palabra clave final no tiene absolutamente nada que ver con eso, por lo que parece que todavía hay confusión. Si explica lo que está esperando que suceda, podremos ayudar más. – Affe
Ah-ha! Mira lo que estás preguntando ahora. Claramente, paso demasiado tiempo en la tierra de los frijoles singleton gestionados. Sí, si leyó toda la sección 17.5 de la especificación del lenguaje Java (que resume el artículo que vinculó), menciona que los objetos a los que se hace referencia en los campos finales también están garantizados al final de la construcción. – Affe