2

如果您有一个如下所示的 Java Singleton:

public class MySingleton {

private static MySingleton instance;

private int member;

public static MySingleton getInstance(){
    if(instance==null){
        instance = new MySingleton();
    }
    return instance;
}

private MySingleton(){
    //empty private constructor
}

public int getMemberA(){
    return member;
}

public int getMemberB(){
    return instance.member;
}

}

... getMemberA 和 getMemberB 之间有区别吗?也就是说,使用instance.xxx和 just访问成员之间有区别xxx吗?

注意:我知道使用单例模式的优缺点!

4

4 回答 4

10

是的,有区别。

您的单例实现当前不是线程安全的,这意味着可以调用除引用getMemberB()的实例之外instance的实例,此时您将获得不同的结果。

如果您的实现是线程安全的(因此实际上只能创建一个实例),那么它们将是等效的,并且更简单的形式将是更可取的。

于 2012-05-17T14:54:22.970 回答
4

没有功能上的区别,但我发现getMemberA()眼睛更容易。

请注意,您的单例不是线程安全的。两个线程同时调用getInstance()可能会导致创建两个对象。如果发生这种情况,单身合同将被打破,所有赌注都将被取消。

于 2012-05-17T14:53:17.420 回答
1

但是,在行为上没有区别,我宁愿使用“return member”甚至“return this.member”,因为这看起来更直观。

线程安全是一个完全不同的话题,这个简单的单例不满足任何线程安全的单例要求。

于 2012-05-17T14:56:39.653 回答
0

您的单例模式实现使用延迟加载技术。但它不是线程安全的。我们可以使用synchronized关键字使getInstance()方法线程安全,但这会损害性能。我们最好对私人单例成员进行仔细检查。

public class MySingleton {

    private volatile static MySingleton instance;

    public static MySingleton getInstance(){
        if (instance == null) {
            synchronized (MySingleton.class) {
                if (instance == null) {
                    instance = new MySingleton();
                }
            }
        }
        return instance;
    }

    private MySingleton(){
        //empty private constructor
    }
}
于 2012-05-17T15:26:34.757 回答