tutorial mvc framework español ejemplos edicion cuarta books arquitectura accion java logging thread-safety slf4j thread-local

mvc - spring java tutorial



¿Es seguro el hilo SLF4J? (2)

Ciertamente, todos asumen que un Logger será seguro para subprocesos. Pero tendría que mirar el código / javadocs de las clases de implementación detrás de la fachada para estar absolutamente seguro.

Para implementaciones específicas:

(Obviamente, estas son declaraciones de que el código respectivo está diseñado para ser seguro para subprocesos. Siempre puede haber errores. Por ejemplo, actualmente hay un par de errores de seguridad de subprocesos abiertos en el rastreador Log4j 2 , aunque no parece ser así. esos errores afectarían directamente su código de ejemplo.)

Es posible que tenga una clase Dog que tenga una sola instancia compartida en varios subprocesos. Planeo usar SLF4J para todo el registro:

public class Dog { private Logger logger = LoggerFactory.getLogger(Dog.class); // ...etc. }

¿Es seguro mi hilo de instancia de logger ? ¿Por qué por qué no?


En conclusión: LoggerFactory.getLogger(Class<?>) " LoggerFactory.getLogger(Class<?>) caché" las instancias del Logger basadas en la clase. Entonces, si llamo LoggerFactory.getLogger(Dog.class) dos veces, obtendré 2 referencias al mismo objeto en la memoria. Esto significa que si 2+ hilos crean una instancia de un Dog , ambos obtendrán la misma instancia de Logger (compartida).

Por lo tanto, la API SLF4J no es segura para subprocesos. Todo depende de la unión que elijas. Parece que los enlaces comunes (log4j, JUL y logback) son seguros para subprocesos, por lo que incluso si varios subprocesos obtienen acceso al mismo Dog Logger , el enlace log4j / JUL / logback logger es seguro para subprocesos, por lo que no tiene problemas.

Caso en cuestión: si está realizando su propio enlace SLF4J, haga que todos los métodos de implementación de su Logger estén synchronized o ThreadLocal seguridad de subprocesos de una manera diferente (proporcionando ThreadLocal , etc.).