第一種(靜態(tài)內(nèi)部類):
public class Singleton {
private Singleton (){}
public static final Singleton getInstance() {
return SingletonHolder.INSTANCE;
}
private static class SingletonHolder {
private static final Singleton INSTANCE = new Singleton();
}
}
第二種(枚舉)
public class EnumSingleton{
private EnumSingleton(){}
public static EnumSingleton getInstance(){
return Singleton.INSTANCE.getInstance();
}
private static enum Singleton{
INSTANCE;
private EnumSingleton singleton;
//JVM會保證此方法絕對只調(diào)用一次
private Singleton(){
singleton = new EnumSingleton();
}
public EnumSingleton getInstance(){
return singleton;
}
}
}
第三種(雙重校驗鎖) //JDK 1.5之后,雙重檢查鎖才能達到正常的單例效果(1.5之前volatile 關(guān)鍵字使用有問題)
public class Singleton {
private volatile static Singleton singleton;
private Singleton() {}
public static Singleton getIntance() {
if(singleton == null) {
synchronized(Singleton.class) {
if(singleton == null) {
singleton = new Singleton();
}
}
}
return singleton;
}
}