public class Singleton{
private static Singleton instance;
private Singleton(){}
public static Singleton getInstance(){
if(instance == null){
instance = new Singleton();
}
return instance;
}
}
public class Singleton{
private static Singleton getInstance;
private Singleton(){
}
public static sychronzied Singleton getInstance(){
if(instance == null){
instance = new Singleton();
}
return instance;
}
}
public class Singleton{
private static Singleton instance = new Singleton();
private Singleton(){}
public static Singleton getInstance(){
}
}
public class Singleton{
private volatile static Singleton singleton;
private Singleton(){}
public static Singleton getSingleton(){
if(singleton == null){
synchronized(Singleton.class){
if(singleton == null) singleton = new Singleton();
}
}
return singleton;
}
}
public class Singleton{
private static class SingletonHolder{
private static final Singleton INSTANCE = new Singleton();
}
private Singleton(){}
public static final Singleton getInstance(){
return SingletonHolder.INSTANCE;
}
}
这种方式同样使用了classloader机制来保证初始化时只有一个线程,它跟第三种方式不同的是:第三种方式只要Singleton 类被装载了,instance 就会被实例化(没有达到lazy loading 效果),而这种方式是Singletong类装在了,instance 不一定被实例化。因为SingletonHolder 类没有主动使用,只有通过显示调用getInstance 方法是菜会显示装在SingletonHolder类,从而实例化instance。