SLF4J线程安全吗?[英] Is SLF4J thread-safe?

问题描述

我可能有一个 Dog 类,它有一个跨多个线程共享的实例.我计划将 SLF4J 用于所有日志记录:

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

    // ...etc.
}

我的 logger 实例线程安全吗?为什么/为什么不?

推荐答案

总结:LoggerFactory.getLogger(Class<?>) "缓存" Logger 基于类的实例.因此,如果我调用 LoggerFactory.getLogger(Dog.class) 两次,我将在内存中获得对同一对象的 2 次引用.这意味着如果 2+ 个线程实例化一个 Dog,它们都将获得相同的(共享的)Dog Logger 实例.

所以 SLF4J API 不是线程安全的.这完全取决于您选择的绑定.看起来常见的绑定(log4j、JUL 和 logback)是线程安全的,所以即使多个线程可以访问同一个 Dog Logger,log4j/JUL/logback 记录器绑定也是线程安全的,所以你没有问题.

举个例子:如果您正在制作自己的 SLF4J 绑定,请将所有 Logger impl 方法制作为 synchronized,或以不同的方式解决线程安全问题(提供 ThreadLocal 等).

本文地址:https://www.itbaoku.cn/post/978703.html