- Puede alguien explicar la seguridad inicialización como es requerido por el modelo de memoria de Java?
- ¿Cómo ayudan los campos final a lograr la seguridad de inicialización ?
- ¿Qué función cumple el constructor para garantizar la seguridad de inicialización ?
Respuesta
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. 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.
"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
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
@axtavt en realidad reordenamiento se previene al hacer un campo volátil no final. Entonces el punto 2 es incorrecto según yo. – Inquisitive
- 1. Explique por favor AsParallel()
- 2. Por favor explique murmur hash?
- 3. Explique las pruebas unitarias por favor
- 4. Modelo de memoria Java
- 5. Por favor, explique los métodos de extensión para mí
- 6. Por favor, explique cómo funcionan las propiedades de C#
- 7. Por favor explique la sintaxis de la definición de la tarea Gradle "<<"
- 8. Por favor, explique este error de enlace: referenciado en la sección .rodata
- 9. El modelo de seguridad de Java ClassLoader
- 10. Por favor explique la salida de funcionamiento de rosca() y start() métodos
- 11. Por favor, explique las reglas de sintaxis y el alcance de "typedef"
- 12. Implementación del modelo de memoria de Java?
- 13. java reordenamiento y la memoria modelo
- 14. Scala y el Modelo de Memoria Java
- 15. Struct v/s clase en C# - Por favor, explique el comportamiento
- 16. Inicialización lenta de seguridad de subprocesos en iOS
- 17. inicialización de la memoria asignada con stackalloc
- 18. Explícame la restricción de monomorfismo por favor?
- 19. Por favor, avísenme sobre la aplicación móvil Java
- 20. ¿El modelo de seguridad Java EE es compatible con ACL?
- 21. Por qué se necesita MD5 para la inicialización de JCE
- 22. python threading: modelo de memoria y visibilidad
- 23. Seguridad de subprocesos en la clase Java
- 24. La inicialización de la matriz Java garantiza
- 25. Modelo de memoria Java: ¿qué es lo que se vacía exactamente en la memoria al cruzar la barrera de la memoria?
- 26. Modelo de memoria Java 7 igual que JSR-133?
- 27. Modelo de memoria Java: reordenamiento y bloqueos concurrentes
- 28. inicialización de miembro de la clase java
- 29. Dame algunos ejercicios de javascript, por favor
- 30. ¿Ofuscar un modelo de seguridad tiene un lugar en la seguridad de las contraseñas?
+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