Dog
複数のスレッドで共有される単一のインスタンスを持つクラスがあるとします。すべてのロギングに SLF4J を使用する予定です。
public class Dog {
private Logger logger = LoggerFactory.getLogger(Dog.class);
// ...etc.
}
私のlogger
インスタンスはスレッドセーフですか? なぜ/なぜしないのですか?
Dog
複数のスレッドで共有される単一のインスタンスを持つクラスがあるとします。すべてのロギングに SLF4J を使用する予定です。
public class Dog {
private Logger logger = LoggerFactory.getLogger(Dog.class);
// ...etc.
}
私のlogger
インスタンスはスレッドセーフですか? なぜ/なぜしないのですか?
確かに、誰もがaがスレッドセーフになると想定しています。Logger
そして(IMO)それは合理的な作業仮定です。ただし、確実に確認するには、ファサードの背後にある実装クラスのコード/javadoc を確認する必要があります。
さまざまな主流の実装のスレッド セーフに関する次の記述を見つけました。
(明らかに、これらは、それぞれのコードがスレッド セーフに設計されているというステートメントです。バグは常に存在する可能性があります。たとえば、Log4j 2 トラッカーでいくつかの未解決のスレッド セーフ バグを書いている時点で、実際にはそうではありませんが 'これらのバグがサンプル コードに直接影響するようには見えません。)
Logger
実際、 aが常にスレッドセーフであることを保証することはできません。誰かが独自の slf4j 互換ロギング クラスを実装する可能性があります。このような実装は、偶然または設計により、スレッドセーフではない可能性があります。もしそうならLogger
、slf4j ファサードを介して公開されたものも非スレッドセーフになります。