由於存在雙重檢查鎖定問題,所以我們必須使用同步,以保證下面的方法(org.apache.struts.util.MessageResources類)的併發訪問:爲什麼在Struts 1.2.7中爲MessageResourcesFactory實例化?
延遲實例
public synchronized static MessageResources getMessageResources(String config) {
if (defaultFactory == null) {
defaultFactory = MessageResourcesFactory.createFactory();
}
return defaultFactory.createResources(config);
}
爲什麼不使用:
EAGER實例
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 2009-07-27 10:16:21