單例設計模式--餓漢式與懶漢式小結
阿新 • • 發佈:2018-11-23
單例設計模式(Singleton)也叫單態設計模式
什麼是單例設計模式?
單例設計模式 要求一個類有且僅有一個例項,並且提供了一個全域性的訪問點。這個單例不應該由人來控制,而應該由程式碼來限制。
單例設計模式的思路:
1.私有化建構函式
2.私有化靜態類變數
3.對外提供獲取例項的方法
常見的單例設計模式有兩種:懶漢式,餓漢式
1,餓漢式--靜態常量--類變數直接例項化
public class Singleton1 { //1.私有化建構函式 private Singleton1() { } //2.私有化靜態類變數並直接例項化---類載入的時候就完成了例項化,final對於不同的應用場景可加可不加。private final static Singleton1 INSTANCE = new Singleton1(); //3.對外提供獲取該例項的方法 public static Singleton1 getInstance() { return INSTANCE; } }
小結:
優點:寫法簡單,類載入的時候就完成了例項化,避免了執行緒同步不安全的問題。
缺點:正由於類載入就完成例項化的特點,如果一直未使用該例項,那麼就會造成記憶體的浪費。
2.餓漢式--靜態程式碼塊---類變數在靜態程式碼塊中被例項化
publicclass Singleton1 { //1.私有化建構函式 private Singleton1() { } //2.私有化靜態類變數,並在靜態程式碼塊中為該變數賦值 private static Singleton1 INSTANCE; static { INSTANCE = new Singleton1(); } //3.對外提供獲取該例項的方法 public static Singleton1 getInstance() { return INSTANCE; } }
小結:(其實這種寫法與上面的寫法類似,只是將直接賦值操作轉移到了靜態程式碼塊中間接賦值,其實現原理相同,都是在類載入的時候完成了例項化)
優點:寫法簡單,類載入的時候就完成了例項化,避免了執行緒同步不安全的問題。
缺點:正由於類載入就完成例項化的特點,如果一直未使用該例項,那麼就會造成記憶體的浪費。
3.懶漢式--雙重(判斷)加鎖機制
public class Singleton { //1.私有化建構函式 private Singleton() { } //2.宣告私有靜態變數 private static Singleton instance; //3.給外界提供獲取物件的方法 public static Singleton getInstance() { if (null == instance) { synchronized (Singleton.class) { if (null == instance) { instance = new Singleton(); } } } return instance; } }
小結:
這種寫法是懶漢式單例設計模式較優的寫法,實現了執行緒安全、延遲載入、效能較優。
4.懶漢式--靜態內部類
public class Singleton { //1.私有化建構函式 private Singleton() { } //2.靜態內部類:靜態內部類在外部類Singleton載入的時候不會被例項化, // 而是在呼叫getInstance方法時,才會被載入完成例項化,這個特點為我們實現了延遲載入。 // 同時靜態內部類只會在第一次載入的時候完成初始化,而在初始化過程中其他執行緒無法進入(JVM的功勞),從而保證了執行緒安全。 private static class SingletonInstance{ private static final Singleton INSTANCE = new Singleton(); } //3.對外提供獲取例項的方法 public static Singleton getInstance() { return SingletonInstance.INSTANCE; } }
小結:
這種設計模式完美的解決了餓漢式沒有延遲載入的弊端,良好的解決了記憶體浪費問題。具有執行緒安全、延遲載入、效率高特點。
單例設計模式的應用場景:
1.工具類物件
2.建立物件時耗時過多或者消耗資源過多,但又經常使用的物件。比如:JDBC連線物件Connection,Redis連線物件Jedis等
3.頻繁建立和銷燬的物件