2013-08-31 23 views
21

Mogę mieć klasę Dog, która ma jedną instancję współużytkowaną w wielu wątkach. I planujesz używać slf4j dla wszystkich logowania:Czy wątek jest bezpieczny dla wątków SLF4J?

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

    // ...etc. 
} 

Czy mój logger instancja wątek bezpieczne? Dlaczego? Dlaczego nie?

Odpowiedz

-10

Podsumowując:. LoggerFactory.getLogger(Class<?>) „bufory” Logger instancji w oparciu o klasy. Więc jeśli dwukrotnie zadzwonię pod numer LoggerFactory.getLogger(Dog.class), otrzymam 2 odniesienia do tego samego obiektu w pamięci. Oznacza to, że jeśli 2+ wątki utworzą instancję Dog, otrzymają one tę samą (udostępnioną) instancję Dog Logger.

Interfejs API SLF4J to , a nie wątek bezpieczny. Wszystko zależy od wybranego wiązania. Wygląda na to, że wspólne powiązania (log4j, JUL i logback) są bezpieczne dla wątków, więc nawet jeśli wiele wątków uzyskuje dostęp do tego samego obiektu Logger, powiązanie dziennika log4j/JUL/logback jest wątkowo bezpieczne, więc nie masz żadnych problemów.

Sprawa w punkcie: jeśli robisz swoją slf4j wiążące, zrobić wszystkie Logger metody IMPL synchronized lub adres wątku bezpieczeństwa w inny sposób (o ile ThreadLocal, itd.).

+15

Obawiam się, że uzasadnienie tej odpowiedzi jest błędne. Fakt, że można uzyskać dwa odniesienia do tego samego "Logger" w różnych wątkach, nie sprawia, że ​​SLF4J nie jest bezpieczny dla wątków. Wszystko, co możemy powiedzieć, to to, że bezpieczeństwo gwintów SLF4J * zależy od * bezpieczeństwa gwintu wykonania za fasadą. –

+0

Szkoda, że ​​OP zaznaczył to, swoją własną odpowiedź, jako poprawną odpowiedź, gdy a) rozumowanie jest błędne (nawet jeśli wniosek jest właściwy), oraz b) Stephen C przedstawił poprawną i lepiej sformułowaną odpowiedź dzień wcześniej. – davidbak

33

Z pewnością każdy użytkownik zakłada, że Logger będzie bezpieczny dla wątków. Ale musiałbyś spojrzeć na kod/javadocs klas implementacji za fasadą, aby być pewnym absolutnie na pewno.

Dla konkretnych wdrożeń:

(Oczywiście, są to stwierdzenia, że ​​dany kod Zaprojektowany do wątku bezpieczne.Może zawsze być błędów.Na przykład są obecnie kilka otwartych bugów wątku bezpieczeństwa w the Log4j 2 tracker, choć nie wydaje się tych błędów będzie bezpośrednio wpływać swoją przykładowy kod)

+0

Dzięki @Stepen C (+1) - czy mówisz, że to zależy od * oprawy *, aby ustalić, czy wątek jest bezpieczny czy nie? A co z samym API SLF4J? –

+0

Nie, nie mogę. Na początek bezpieczeństwo wątków ostatecznie zależy od zaimplementowanego zachowania kodu rejestratora, który nie jest częścią SLF4J! (Rozumiesz, że SLF4J to fasada ... czyż nie?) –

+0

Tak - rozumiem, że SLF4J to fasada. Być może zadaję tutaj niewłaściwe pytanie. Biorąc pod uwagę powyższy przykład kodu, czy instancja 'Dog' istnieje w 2+ wątkach, czy muszę się martwić - niezależnie od powiązania SLF4J używanego w czasie wykonywania - o dziwacznym zachowaniu' logger', czy mogę być pewna, że ​​(ponownie, niezależnie od powiązania) Nie będę mieć współużytkowanego stanu rejestrowania we wszystkich wątkach? –