En ingeniería de software , el lenguaje de titular de inicialización bajo demanda ( patrón de diseño ) es un singleton cargado de forma diferida . En todas las versiones de Java, el idioma permite una inicialización perezosa segura y altamente concurrente de campos estáticos con buen rendimiento. [1] [2]
público de clase Algo { privado Algo () {} private static class LazyHolder { static final Algo INSTANCIA = nuevo Algo (); } public static Algo getInstance () { return LazyHolder . INSTANCIA ; } }
La implementación del idioma se basa en la fase de inicialización de la ejecución dentro de la máquina virtual Java (JVM) según lo especificado por la especificación del lenguaje Java (JLS). [3] Cuando la Something
JVM carga la clase, la clase pasa por la inicialización. Dado que la clase no tiene ninguna variable estática para inicializar, la inicialización se completa trivialmente. La definición de clase estática LazyHolder
dentro de ella no se inicializa hasta que la JVM determina que LazyHolder
debe ejecutarse. La clase estática LazyHolder
solo se ejecuta cuando getInstance
se invoca el método estático en la clase Something
, y la primera vez que esto sucede, la JVM cargará e inicializará la LazyHolder
clase. La inicialización de la LazyHolder
clase da como resultado la inicialización de la variable estática INSTANCE
ejecutando el constructor (privado) para la clase externa Something
. Dado que el JLS garantiza que la fase de inicialización de la clase sea secuencial, es decir, no concurrente, no se requiere más sincronización en el getInstance
método estático durante la carga y la inicialización. Y dado que la fase de inicialización escribe la variable estática INSTANCE
en una operación secuencial, todas las invocaciones simultáneas subsiguientes de la getInstance
devolverán lo mismo correctamente inicializado INSTANCE
sin incurrir en ninguna sobrecarga de sincronización adicional.
Advertencias
Si bien la implementación es un caché "singleton" seguro para subprocesos sin sobrecarga de sincronización, y con un mejor rendimiento que la sincronización no atendida, [4] el idioma solo se puede usar cuando Something
se garantiza que la construcción de no fallará. En la mayoría de las implementaciones de JVM, si Something
falla la construcción , los intentos posteriores de inicializarlo desde el mismo cargador de clases darán como resultado un NoClassDefFoundError
error.
Ver también
enlaces externos
Referencias
- ^ El modismo de bloqueo comprobado dos veces no funciona correctamente en las versiones de Java anteriores a la 1.5.
- ^
INSTANCE
debe ser el paquete privado - ^ Consulte 12.4 de la Especificación del lenguaje Java para obtener más detalles.
- ^ "Singleton seguro para subprocesos más rápido en la JVM" . literatejava.com .