我们使用spring来构造/注入我们的java bean。这是一个片段:
<bean id="myAppConfigs" class="my.cool.webapp.ApplicationConfig" scope="singleton">
<constructor-arg value="8080" />
<constructor-arg value="MyAppName1" />
</bean>
我们在
中使用单身模式public static ApplicationConfig getCurrentInstance(ServletContext sctx) {
if (instance == null) {
WebApplicationContext wac = null;
if (sctx != null) {
wac = WebApplicationContextUtils.getWebApplicationContext(sctx);
}
return (ApplicationConfig) wac.getBean("myAppConfigs");
由于bean只读取了一些总是相同的属性,我怀疑可能存在问题。但我仍然很好奇一个很好的线程安全方法来实现它 当然Double Checked Locking with usage of volatile是线程安全的。 但是,还有另一种方法可以将Initialization on demand holder idiom 与函数/构造函数参数一起使用吗?
答案 0 :(得分:1)
public static ApplicationConfig getCurrentInstance(ServletContext sctx) {
if (sctx == null) {
throw new AssertionError("ServletContext is null");
}
WebApplicationContext wac = WebApplicationContextUtils.getWebApplicationContext(sctx);
if (wac == null) {
throw new AssertionError("No ApplicationContext associated with ServletContext");
}
return (ApplicationConfig) wac.getBean("myAppConfigs");
}
这是很多线程安全的。更好的是努力一直使用注入(通过注释或XML bean定义),但这并不总是可行。
使用Spring(DI)混合单例模式和显式线程同步是一种反模式,而不是真正的必要。 Spring bean工厂本身就是线程安全的,所以你不需要在它上面添加任何额外的锁定/同步。