public class Stage {
private int i = 0;
private Stage(){
}
private static class StageOne {
static Stage instance = new Stage();
}
public static Stage getInstance(){
return StageOne.instance;
}
public void setI(int i){
this.i = i;
}
public int getI(){
return this.i;
}
}
调用Stage.getInstance()
方法可以获取唯一的对象实例,无论调用几次都是返回同一个实例。
由于Java静态变量初始化是线程安全的,所以以上方式在多线程程序中也可以保证对象实例唯一(在确保只有一个类加载器加载本类的情况下);
如下获取单例对象的方式就不是线程安全的:如有两个线程,线程1执行完第6行进入if分支,还未执行第7行时,线程2又开始执行第6行,也进入if分支,此时就会new两次从而生成两个对象。
public class Singleton {
private static Singleton instance;
private Singleton() {
}
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}