我々は以下の方法(のorg.apache.struts.util.MessageResourcesクラス)への同時アクセスを保証するために、同期を使用する必要がありますので、ダブルチェックロックの問題があるので:Struts 1.2.7のMessageResourcesFactoryの遅延インスタンス化はなぜですか?
LAZY INSTANTIATION
public synchronized static MessageResources getMessageResources(String config) {
if (defaultFactory == null) {
defaultFactory = MessageResourcesFactory.createFactory();
}
return defaultFactory.createResources(config);
}
は、
なぜ使用しない:
EAGER INSTANTIATIONその後、
static {
// Construct a new instance of the specified factory class
try {
if (clazz == null)
clazz = RequestUtils.applicationClass(factoryClass);
MessageResourcesFactory defaultFactory =
(MessageResourcesFactory) clazz.newInstance();
} catch (Exception e) {
LOG.error("MessageResourcesFactory.createFactory", e);
}
}
そして:
public static MessageResources getMessageResources(String config) {
return defaultFactory.createResources(config);
}
これは、getMessageResourcesメソッドへの同時アクセスを許可します。これは、少なくとも私の場合、かなり数回呼び出される可能性があります。同期を使用していない
意味はここにある:
http://en.wikipedia.org/wiki/Double-checked_locking
なぜそれらは複数回作成されますか? – skaffman
申し訳ありませんが、私はコードを誤って読んでいない、私は方法が同期されていないと思った、それはクライアントにそれを同期することでした。私は私の質問は、メソッドが同期されていない場合、それは大きな問題になると思いますか? –
はい、不完全に初期化されたオブジェクトへの参照を取得する可能性があるため、マルチスレッド環境では問題になります。 –