14
  1. Puede alguien explicar la seguridad inicialización como es requerido por el modelo de memoria de Java?
  2. ¿Cómo ayudan los campos final a lograr la seguridad de inicialización ?
  3. ¿Qué función cumple el constructor para garantizar la seguridad de inicialización ?

Respuesta

21

La seguridad de inicialización permite que un objeto sea visto por un hilo externo en su estado completamente construido (inicializado). El requisito previo es que el objeto no se publique prematuramente, es decir. en su constructor Una vez que esto está garantizado, JMM requiere cierto comportamiento para los campos que están declarados como final. En primer lugar, todos los final campos del objeto son guarenteed para ser visto por una rosca externa en su estado completamente inicializado - esto no es tan trivial como parece -

Considérese una clase

class A{ 
    List list ; 
    A() { 
     list = Arrays.asList(some init expressions that adds 10 elements to list); 
    } 

} 

Un hilo que accede a la list de la instancia A no está garantizado por defecto para ver 10 elementos en esa lista. De hecho, este hilo incluso puede ver list como null. Sin embargo, si list se declara final, entonces, como lo requiere JMM, el list siempre debe aparecer como inicializado con 10 elementos.

En segundo lugar, esta garantía de inicialización no se limita al campo final en sí, sino que se extiende de forma recursiva a todos los objetos mencionados por él. Por ejemplo, si el list en el ejemplo anterior es una lista de list s, entonces el hilo externo está garantizado para ver las listas internas como completamente inicializadas.

Tenga en cuenta que en ninguna parte estamos usando synchronized para lograr esta seguridad en la visibilidad de la memoria (sucede antes de la relación).

+1

+1 por mencionar que la seguridad de la iniciación no solo garantiza la seguridad de los campos finales sino también de los objetos a los que se hace referencia en los campos finales. – Inquisitive

4

1. la seguridad de inicialización permite construir adecuadamente objetos inmutables ser compartidos de forma segura a través de hilos sin necesidad de utilizar la sincronización, independientemente de si se publican incluso usando una carrera de datos.

2. objetos que tienen campo final, la seguridad de inicialización evitan reordenar cualquier parte de la construcción con la carga inicial de una referencia a ese objeto.

+0

"independientemente de si se publicaron utilizando una carrera de datos". Esta línea no tiene ningún sentido en absoluto. Los objetos no se publican usando razas de datos :-). – Inquisitive

+2

No estoy seguro acerca de "evitar el reordenamiento de cualquier parte de la construcción". Las garantías para los campos finales solo surten efecto para la inicialización de esos campos finales, no otras partes de la construcción. – axtavt

+0

@axtavt en realidad reordenamiento se previene al hacer un campo volátil no final. Entonces el punto 2 es incorrecto según yo. – Inquisitive

Cuestiones relacionadas