Java單例模式的幾種實現方式
在Java 中,單例類只能有一個實例,必須創建自己的唯一實例,單例類必須給所有其他對象提供這一實例。Java 單例模式有很多種實現方式,在這里給大家介紹單例模式其中的幾種。分別是餓漢式,懶漢式,Double CheckLock實現單例,靜態內部類。它們都有相互的優缺點。
適用場景:
需要生成唯一序列的環境。
需要頻繁實例化然后銷毀的對象。
創建對象時耗時過多或者耗資源過多,但又經常用到的對象。
方便資源相互通信的環境。
選擇:
單例對象占用資源少,不需要延時加載,枚舉好于餓漢。
單例對象占用資源多,需要延時加載,靜態內部類好于懶漢式。
一. 餓漢式
線程安全,調用效率高,但是不能延時加載。
//實例化這個類
public class Singleton {private static final Singleton instance = new Singleton();// 私有化構造器private Singleton(){} //創建靜態工廠方法,讓外部可以獲取實例public static Singleton getInstance(){return instance;}
}
二. 懶漢式
線程安全,調用效率不高,但是能夠延時加載。
//類初始化時,不初始化這個對象(延時加載,真正用的時候再創建)
public class Singleton {private static final Singleton instance;// 私有化構造器 private Singleton(){} //方法同步,調用效率低// 創建靜態工廠方法 ,讓外部可以獲取實例public static synchronized Singleton getInstance(){if (instance == null) {instance = new Singleton();}}
}
三. Double CheckLock實現單例
Double CheckLock 雙重鎖判斷機制(由于JVM底層模型原因,偶爾會出問題,不建議使用),是在懶漢式單例基礎上發展而來的。
public class Singleton {private volatile static Singleton instance; // 私有化構造器private Singleton(){ } //靜態工廠方法,雙重鎖判斷機制public static Singleton newInstance(){if (instance == null) {synchronized (Singleton.class) {if (instance == null) {instance = new Singleton();} }}
return instance;}
}
四.靜態內部類
線程安全,調用效率高,可以延時加載。
public class Singleton {private static class fw{private static final Singleton instance = new Singleton();}// 私有化構造器private Singleton(){} //靜態工廠方法public static Singleton getstance(){return fw.instance;}
}