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:
- Log4j 1.2 es seguro para subprocesos
- java.util.logging.Logger es seguro para subprocesos (busque " seguro para múltiples subprocesos")
- Logback es seguro para subprocesos
(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.).