java中的Singleton不能创建实例

时间:2014-04-24 15:56:31

标签: java singleton

我正在尝试在我的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);
    }
}

2 个答案:

答案 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以开始。可能是我是偏执狂,但我相信"更安全而不是抱歉"规则与代码。