我从这里了解了单身模式http://www.oracle.com/technetwork/articles/java/singleton-1577166.html,并描述了一些常见的实现错误。我只是想检查一下我写的这些程序是否证明它们不正确。
在第一个程序中,我创建了一个继承的类,并调用了基类的受保护构造函数。这允许我创建2个Singleton实例。
import java.util.*;
import java.lang.*;
import java.io.*;
class Singleton {
public static Singleton Instance() {
if (_instance == null) {
_instance = new Singleton();
return _instance;
}
return _instance;
}
protected Singleton() {}
private static Singleton _instance = null;
}
class SingletonBasher extends Singleton {
public SingletonBasher() {
}
}
class Ideone
{
public static void main (String[] args) throws java.lang.Exception
{
Singleton x = new Singleton();
Singleton y = SingletonBasher.Instance();
if(x != y)
System.out.println("fail!");
}
}
在第二个程序中,我只使用new运算符创建了两个对象,这是有效的,因为构造函数受到保护。如果它是私有的,我会被迫使用Instance方法,它只允许我创建1个实例。
import java.util.*;
import java.lang.*;
import java.io.*;
class Singleton {
public static Singleton Instance() {
if (_instance == null) {
_instance = new Singleton();
return _instance;
}
return _instance;
}
private Singleton() {}
private static Singleton _instance = null;
}
class Ideone
{
public static void main (String[] args) throws java.lang.Exception
{
Singleton x = Singleton.Instance();
Singleton y = Singleton.Instance();
if(x != y)
System.out.println("fail!");
}
}
答案 0 :(得分:0)
这个Singleton类适用于单线程程序。如果您希望在多线程程序中运行它。你需要;
急切地初始化_instance
变量,如下所示
private static Singleton _instance = new Singleton();
将Instance()
的访问权限与{{p}}次检查同步。