繁体   English   中英

这是单线程环境中的有效 Singleton class 吗?

[英]Is this a valid Singleton class in a single threaded environment?

单线程环境中最常见的 Singleton class 示例如下:

{
    private static Singleton obj;
 
    // private constructor to force use of
    // getInstance() to create Singleton object
    private Singleton() {}
 
    public static Singleton getInstance()
    {
        if (obj==null)
            obj = new Singleton();
        return obj;
    }
}

根据我的理解,以下也可以认为是 Singleton,不是吗?

public class SingleTon {
    static SingleTon s;
     SingleTon getInstance() {
        if (s == null) {
            s = new SingleTon();
        }
        return s;
    }
    public static void main(String[] args) {
        SingleTon s1 = new SingleTon();
        s1 = s1.getInstance();
        SingleTon s2 =new SingleTon();
        s2 = s2.getInstance();
    }
}

第二种情况的不同之处在于,我没有添加私有构造函数,即使最初创建了 2 个不同的实例,通过重新分配getInstance的值,我们也使实例使用相同的 object。

请让我知道我的理解是否正确。

对于单线程环境,您的第一个 class 是 singleton 但不是第二个。

对于 singleton class,在 JVM 中必须只存在一个 object 但在第二种情况下,您没有将构造函数设为私有,因此默认情况下在编译时编译器将添加默认公共构造函数,这将打破 singleton 的规则,因为无论何时将调用new Singleton() ,它将返回一个新实例,因此没有使用公共构造函数的getInstance方法的意义。

对于 singleton class 私有构造函数是必须的,这样它就不能从 class 外部初始化。

第二个不是 Singleton,singleton class 的构造函数必须是私有的。

您也可以使用早期初始化来创建 singleton class -

{
private static Singleton obj = new Singleton();

private Singleton() {}

public static Singleton getInstance()
{
    return obj;
}

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM