访问Java Singleton私有成员的正确方法

时间:2012-05-17 14:50:48

标签: java singleton

如果您的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.xxxxxx访问该成员之间是否存在差异?

注意:我知道使用Singleton模式的优点和缺点!

4 个答案:

答案 0 :(得分:10)

是的,有区别。

您的单例实现目前不是线程安全的,这意味着可以在getMemberB()上的{{1>}上调用instance而不是 {{1}}引用的实例。会得到不同的结果。

如果你的实现是线程安全的(所以真的只能创建一个实例)那么它们就是等价的,而更简单的形式会更受欢迎。

答案 1 :(得分:4)

没有功能差异,但我发现getMemberA()更容易看到。

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

答案 2 :(得分:1)

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

线程安全是一个完全不同的主题,这个简单的单例不符合任何线程安全的单例要求。

答案 3 :(得分:0)

您对Singleton模式的实现使用延迟加载技术。但它不是线程安全的。我们可以使用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
    }
}