一般來說,單例模式有五種寫法:懶漢、餓漢、雙重檢驗鎖、靜態(tài)內(nèi)部類、枚舉。所說都是線程安全的實現(xiàn)。
一般情況下直接使用餓漢式就好了,如果明確要求要懶加載(lazy initialization)會傾向于使用靜態(tài)內(nèi)部類,如果涉及到反序列化創(chuàng)建對象時會試著使用枚舉的方式來實現(xiàn)單例。
懶漢式
public final class Singleton {
private static Singleton instance;
private Singleton() {
//
}
public static Singleton getInstance() {
synchronized (Singleton.class) {
if(instance == null) {
instance = new Singleton();
}
}
return instance;
}
}
雙重檢驗鎖
public final class Singleton {
//用volatile修飾對象,禁止指令重排序優(yōu)化
private volatile static Singleton instance;
private Singleton() {
//
}
public static Singleton getInstance() {
if(instance == null) {
synchronized (Singleton.class) {
if(instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}
餓漢式
public final class Singleton {
//類加載時就初始化
private static final Singleton instance = new Singleton();
private Singleton() {
//
}
public static Singleton getInstance() {
return instance;
}
}
靜態(tài)內(nèi)部類
public final class Singleton {
private Singleton() {
//
}
private static class SingletonHolder {
private static final Singleton INSTANCE = new Singleton();
}
public static Singleton getInstance() {
return SingletonHolder.INSTANCE;
}
}
枚舉
public enum EnumSingleton {
INSTANCE;
private EnumSingleton() {
}
}