單例模式簡介
本文介紹了單例模式並附有java程式碼實現demo。內容僅供參考使用,有不足之處請及時指出,也歡迎大家交流探討。
單例模式
單例模式是建立型模式的一種,其保證了單例類只有一個例項物件。
單例模式特性
單例模式實現方式有多種,但其遵循以下3個特性。
-
單例類只能有一個例項物件。
-
該例項物件只能由單例類本身構建。
-
單例類必須向其他物件提供該例項物件。
懶漢式
public class SingletonDemo { private static SingletonDemo instance; private SingletonDemo() { } public static synchronized SingletonDemo getInstance() { if (null == instance) { instance = new SingletonDemo(); } return instance; } }
時間換空間,懶載入,用synchronized修飾保證了多執行緒安全,但也降低了效率。
餓漢式
public class SingletonDemo { private static SingletonDemo instance = new SingletonDemo(); private SingletonDemo() { } public static SingletonDemo getInstance() { return instance; } }
空間換時間,非懶載入,通過類載入機制保證了執行緒安全,沒有使用synchronized,效率相對比要高一些。
雙重檢查加鎖(DCL:Double-checked Locking)
public class SingletonDemo { private volatile static SingletonDemo instance; private SingletonDemo() { } public static SingletonDemo getInstance() { if (null == instance) { synchronized (SingletonDemo.class) { if (null == instance) { // 因為該操作非原子性,需用volatile修飾 instance = new SingletonDemo(); } } } return instance; } }
時間換空間,懶載入,將synchronized由getInstance具體到對應的構建單例操作上,即保證了多執行緒安全,想對比懶漢式也提高了效率。
靜態內部類
public class SingletonDemo { private static class SingletonDemoHolder { private static final SingletonDemo instance = new SingletonDemo(); } private SingletonDemo() { } public static final SingletonDemo getInstance() { return SingletonDemoHolder.instance; } }
時間換空間,懶載入,通過引入靜態內部類,避免了SingletonDemo的載入導致instance的初始化,實現了懶載入,而且效能上相對比雙重檢查加鎖有所提高。