Tenemos una gran cantidad de código de la clase que tiene algunas repetitivo como el siguiente:¿Es eficiente obtener un registrador de un inicializador de variable final estático?
private static Logger logger = null;
private static Logger getLogger() {
if (logger == null) {
logger = Logger.getLogger(MyClass.class);
}
return logger;
}
La idea es que la clase puede tener logs de depuración en el registrador. El primer código que necesita registrar algo invoca getLogger() y eso hace que el registrador exista.
Hay un par de cosas que no me gustan de este patrón. Primero, el singleton getLogger() no está sincronizado y sincronizándolo, mientras que el correcto representaría una carga en cada llamada subsiguiente sin ninguna razón.
Realmente quiero ser capaz de condensar abajo a esto:
private static final Logger logger = Logger.getLogger(MyClass.class);
Entonces puede simplemente hacer referencia registrador de forma directa y ni siquiera se molestan con un captador Singleton.
El problema que me teme es que al hacer esto hago que se cree un registrador cuando se carga la clase, incluso si nunca se llama al registrador. Tengo más de 10.000 clases impares todas llamando a getLogger(), entonces, ¿cuántas instancias de Logger estoy creando aquí? Si mis propiedades log4j contienen algunos appenders, ¿estoy haciendo referencia al mismo registrador una y otra vez, o estoy creando 10.000 de estas cosas?
¡Considera la seguridad de las hebras! –
Estoy considerando la seguridad de hilos. Es por eso que quiero deshacerme del singleton roto y confiar en el cargador de clases intrínsecamente seguro para hilos. – locka
AFAICS el problema es que si dos subprocesos intentan capturar el registrador al mismo tiempo, se crearán dos instancias 'Logger'. –