我々は、次のようないくつかの定型を持つクラスのコードの多くを持っている:静的最終変数初期化子からLoggerを取得するのは効率的ですか?
private static Logger logger = null;
private static Logger getLogger() {
if (logger == null) {
logger = Logger.getLogger(MyClass.class);
}
return logger;
}
アイデアは、クラスがロガーにデバッグものをログに記録できることです。何かをログに記録する必要がある最初のコードは、getLogger()を呼び出し、ロガーを存在させます。
このパターンについて私が気に入らないことがいくつかあります。まず、シングルトンのgetLogger()は同期化されておらず、同期していますが、正しい理由は何もないため、後続の各コールに負担がかかります。
私は本当にただこれにそれを凝縮することができるようにしたい:
private static final Logger logger = Logger.getLogger(MyClass.class);
その後、私はちょうど直接ロガーを参照することができ、さらにはシングルトンゲッターと気にしません。
私が恐れる問題は、これを行うことで、ロガーが呼び出されなくてもクラスがロードされたときにロガーが作成されることです。私は10,000以上の奇数のクラスをすべてgetLogger()を呼び出すので、実際にここで作成するLoggerのインスタンスはいくつですか?私のlog4jプロパティにいくつかのアペンダーが含まれている場合、私は同じロガーを何度も繰り返し参照していますか、またはこれらのものを10,000個作成していますか?
スレッド安全性を考慮してください! –
スレッドの安全性を検討しています。だから、私は壊れたシングルトンを取り除き、本質的にスレッドセーフなクラスローダーに頼っています。 – locka
AFAICS問題は、2つのスレッドが同時にロガーをフェッチしようとすると、2つの 'Logger'インスタンスが作成されるということです。 –