常見的五種單例模式實現方式及其特點
– 主要:
. 餓漢式(線程安全,調用效率高。 但是,不能延時加載。)
. 懶漢式(線程安全,調用效率不高。 但是,可以延時加載。)
– 其他:
. 雙重檢測鎖式(由於JVM底層內部模型原因,偶爾會出問題。不建議使用)
. 靜態內部類式(線程安全,調用效率高。 但是,可以延時加載)
. 枚舉式(線程安全,調用效率高,不能延時加載。並且可以天然的防止反射和反序列
化漏洞!)
. 如何選用?
– 單例對象 佔用 資源 少,不需要 延時加載:
. 枚舉式 好於 餓漢式
– 單例對象 佔用 資源 大,需要 延時加載:
. 靜態內部類式 好於 懶漢式
單例模式只生成一個實例,減少了系統性能開銷,當一個對象的產生需要比較多的資源時,如讀取配置、產生其他依賴對象時,則可以通過在應用啓動時直接產生一個單例對象,然後永久駐留內存的方式來解決。
餓漢式:
public class Singleton {
private static /*final*/ Singleton s = new Singleton();
private Singleton(){} //私有化構造器
public static /*synchronized*/ Singleton getInstance(){
return s;
}
}
懶漢式:
public class Singleton {
private static Singleton s;
private SingletonDemo01(){} //私有化構造器
public static synchronized Singleton getInstance(){
if(s==null){
s = new Singleton();
}
return s;
}
}
雙重檢測鎖:
public class SingletonDemo03 { private static Singleton instance = null; public static Singleton getInstance() { if (instance == null) { SingletonDemo03 sc; synchronized (Singleton.class) { sc = instance; if (sc == null) { synchronized (Singleton.class) { if(sc == null) { sc = new Singleton(); } } instance = sc; } } } return instance; } private Singleton() { } }
靜態內部類方法:
public class Singleton {
private static class SingletonClassInstance {
private static final Singleton instance = new Singleton();
}
public static Singleton getInstance() {
return SingletonClassInstance.instance;
}
private Singleton() {
}
}
枚舉模式:
public enum SingletonDemo05 {
/**
* 定義一個枚舉的元素,它就代表了Singleton的一個實例。
*/
INSTANCE;
/**
* 單例可以有自己的操作
*/
public void singletonOperation(){
//功能處理
}
}