[英]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.