28

Dog複数のスレッドで共有される単一のインスタンスを持つクラスがあるとします。すべてのロギングに SLF4J を使用する予定です。

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

    // ...etc.
}

私のloggerインスタンスはスレッドセーフですか? なぜ/なぜしないのですか?

4

1 に答える 1

48

確かに、誰もがaがスレッドセーフになると想定しています。Loggerそして(IMO)それは合理的な作業仮定です。ただし、確実に確認するには、ファサードの背後にある実装クラスのコード/javadoc を確認する必要があります

さまざまな主流の実装のスレッド セーフに関する次の記述を見つけました。

(明らかに、これらは、それぞれのコードがスレッド セーフに設計されているというステートメントです。バグは常に存在する可能性があります。たとえば、Log4j 2 トラッカーでいくつかの未解決のスレッド セーフ バグを書いている時点で、実際にはそうではありませんが 'これらのバグがサンプル コードに直接影響するようには見えません。)

Logger実際、 aが常にスレッドセーフであることを保証することはできません。誰かが独自の slf4j 互換ロギング クラスを実装する可能性があります。このような実装は、偶然または設計により、スレッドセーフではない可能性があります。もしそうならLogger、slf4j ファサードを介して公開されたものも非スレッドセーフになります。

于 2013-08-31T01:40:39.613 に答える