Подтвердить что ты не робот

Является ли SLF4J потокобезопасным?

У меня может быть класс Dog, который имеет один экземпляр, общий для нескольких потоков. Я планирую использовать SLF4J для всех записей:

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

    // ...etc.
}

Является ли поток потоков logger личным? Почему/почему нет?

4b9b3361

Ответ 1

В заключение: LoggerFactory.getLogger(Class<?>) "кэширует" Logger экземпляры на основе класса. Поэтому, если я дважды вызываю LoggerFactory.getLogger(Dog.class), я получу 2 ссылки на один и тот же объект в памяти. Это означает, что если 2+ потоки создают экземпляр Dog, они оба получат одинаковый (общий) экземпляр Dog Logger.

Таким образом, API SLF4J не является потокобезопасным. Все зависит от выбранного вами связывания. Похоже, что общие привязки (log4j, JUL и logback) являются потокобезопасными, поэтому даже если несколько потоков получают доступ к одной и той же Dog Logger, привязка журнала log4j/JUL/logback является потокобезопасной, поэтому у вас нет вопросы.

Пример: если вы создаете собственную привязку SLF4J, сделайте все свои методы Logger impl synchronized или поправьте безопасность потоков по-другому (предоставляя ThreadLocal и т.д.).

Ответ 2

Конечно, все предполагают, что Logger будет потокобезопасным. Но вам нужно будет посмотреть на код /​​javadocs классов реализации за фасадом, чтобы быть уверенным абсолютно.

Для конкретных реализаций:

(Очевидно, что это утверждения, что соответствующий код предназначен для потокобезопасности. Всегда могут быть ошибки. Например, в настоящее время существует несколько ошибок с открытым потоком в трекер Log4j 2, хотя похоже, что эти ошибки напрямую влияют на ваш примерный код.)