我正在尝试在我的java servlet中创建一个单例实例。但我遇到了一些我找不到的问题。
我用一种方法执行:
RegisterHandler reg = RegisterHandler.getInstance();
在registerHandler中我有getInstance方法:
private static RegisterHandler instancia ;
public static RegisterHandler getInstance() {
if(instancia==null){ //SI ES NULL
instancia = new RegisterHandler(); //LO INSTANCIAMOS
}
return instancia;
}
我认为它应该返回一个新实例,如果它不存在或现有实例,但是第一次尝试执行它时,它会进入instancia == null并崩溃。没有错误。
有什么想法吗?
我添加了我的构造函数:
private RegisterHandler() {
try {
this.publisher = new AMQEventPublisher("failover:tcp://127.0.0.1:9009");
} catch (NormalException e) {
log.error("Error",e);
}
}
答案 0 :(得分:0)
声明instancia
volatile。
另外为避免可能重复的RegisterHandler使用双重锁定:
private static volatile RegisterHandler instancia;
private static final Object instanciaLockObject = new Object();
public static RegisterHandler getInstance() {
if(instancia==null){ //SI ES NULL
synchronized(instanciaLockObject) {
if(instancia==null){
instancia = new RegisterHandler(); //LO INSTANCIAMOS
}
}
}
return instancia;
}
该模式称为双重检查锁定:http://en.wikipedia.org/wiki/Double-checked_locking
答案 1 :(得分:-2)
我还要确保将instancia设置为null以开始。可能是我是偏执狂,但我相信"更安全而不是抱歉"规则与代码。