【发布时间】:2013-05-31 09:48:42
【问题描述】:
朋友们,我正在阅读 Spring 3 in Action
它说:- Spring Containers 提供 Singleton Bean,默认情况下,当我们使用构造函数创建它们时。但是如果我们使用工厂方法,那么它应该以只返回单个 bean 的方式实现。第 37 页带标题
CREATING BEANS THROUGH FACTORY METHODS
因此,作者必须通过以下代码来维护线程安全。否则两个并发线程可能会创建两个 Spring Bean 实例。
package com.springinaction.springidol;
public class Stage {
private Stage() {
}
private static class StageSingletonHolder {
static Stage instance = new Stage();
}
public static Stage getInstance() {
return StageSingletonHolder.instance;
}
}
静态 getInstance() 方法每次调用都会返回相同的实例。 (对于线程 为了安全起见,getInstance() 采用了一种称为“按需初始化”的技术来创建单例实例。)
然后它使用 XML
<bean id="theStage"
class="com.springinaction.springidol.Stage"
factory-method="getInstance" />
将 getInstance 声明为工厂方法。
我清楚地理解了这一点。但是后来,出于好奇,我想如果我通过删除这个静态初始化从 Class Stage 中删除这个线程安全概念
package com.springinaction.springidol;
public class Stage {
private Stage() {
}
public static Stage getInstance() {
return new Stage();
}
}
那么,两个并发线程可以拥有多个 Stage 类的实例。我知道这只是一种可能。在这种情况下,线程 1 调用 Spring Container (ApplicationContext) 实例上的 getBean("theStage") 方法是可能的。它发现没有这种bean的实例。与此同时,当线程 2 接管时,它也发现没有此类 bean 的实例。现在两个线程都创建了两个不同的 Spring bean,因为工厂方法不是线程安全的。
如何通过修改的 getInstance 方法(现在不是线程安全的)增加两个线程返回不同实例的可能性。
请帮忙
【问题讨论】:
标签: multithreading spring thread-safety race-condition