標籤:zed 自己 餓漢式 code ati 無鎖 類方法 == singleton
學習整理
飽漢模式(懶漢模式)
1 // 飽漢 2 // UnThreadSafe 3 public class Singleton1 { 4 private static Singleton1 singleton = null; 5 private Singleton1() { 6 } 7 public static Singleton1 getInstance() { 8 if (singleton == null) { 9 singleton = new Singleton1();10 }11 return singleton;12 }13 }
優點:懶載入啟動快,資源佔用小,使用時才執行個體化,無鎖。
缺點:非安全執行緒。
飽漢模式(懶漢模式)--安全執行緒
1 public class Singleton { 2 3 /** 4 * 定義一個變數來儲存建立好的類執行個體 5 */ 6 7 private static Singleton uniqueInstance = null; 8 9 /**10 * 私人化構造方法,好在內部控制建立執行個體的數目11 */12 13 private Singleton(){14 }15 16 /**17 * 定義一個方法來為用戶端提供類執行個體18 * @return 一個Singleton的執行個體19 */20 21 public static synchronized Singleton getInstance(){22 23 //判斷儲存執行個體的變數是否有值24 if(uniqueInstance == null){25 //如果沒有,就建立一個類執行個體,並把值賦值給儲存類執行個體的變數26 uniqueInstance = new Singleton();27 }28 29 //如果有值,那就直接使用30 return uniqueInstance;31 }32 33 /**34 * 示意方法,單例可以有自己的操作35 */36 37 public void singletonOperation(){38 39 //功能處理40 41 }42 43 /**44 * 示意屬性,單例可以有自己的屬性45 */46 47 private String singletonData;48 49 /**50 * 示意方法,讓外部通過這些方法來訪問屬性的值51 * @return 屬性的值52 */53 54 public String getSingletonData(){55 56 return singletonData;57 58 }59 60 }
優點:同上,但加鎖了。
缺點:synchronized 為獨佔獨佔鎖定,並發效能差。即使在建立成功以後,擷取執行個體仍然是序列化操作。
飽漢模式(懶漢模式)--雙重加鎖檢查DCL(Double Check Lock)
1 public class Singleton { 2 3 /** 4 * 對儲存執行個體的變數添加volatile的修飾 5 */ 6 7 private volatile static Singleton instance = null; 8 9 private Singleton(){10 11 }12 13 public static Singleton getInstance(){14 15 //先檢查執行個體是否存在,如果不存在才進入下面的同步塊16 17 if(instance == null){18 19 //同步塊,安全執行緒的建立執行個體20 21 synchronized(Singleton.class){22 23 //再次檢查執行個體是否存在,如果不存在才真的建立執行個體24 25 if(instance == null){26 27 instance = new Singleton();28 29 }30 31 }32 33 }34 35 return instance;36 37 }38 39 }
優點:懶載入,安全執行緒。
註:執行個體必須有 volatile 關鍵字修飾,其保證初始化完全。
餓漢模式
1 public class Singleton { 2 3 //4:定義一個靜態變數來儲存建立好的類執行個體 4 5 //直接在這裡建立類執行個體,只會建立一次 6 7 private static Singleton instance = new Singleton(); 8 9 //1:私人化構造方法,好在內部控制建立執行個體的數目10 11 private Singleton(){12 13 }14 15 //2:定義一個方法來為用戶端提供類執行個體16 17 //3:這個方法需要定義成類方法,也就是要加static18 19 //這個方法裡面就不需要控制碼了20 21 public static Singleton getInstance(){22 23 //5:直接使用已經建立好的執行個體24 25 return instance;26 27 }28 29 }
優點:餓漢模式天生是安全執行緒的,使用時沒有延遲。
缺點:啟動時即建立執行個體,啟動慢,有可能造成資源浪費。
Holder模式
1 public class Singleton { 2 /** 3 * 類級的內部類,也就是靜態成員式內部類,該內部類的執行個體與外部類的執行個體 4 * 沒有綁定關係,而且只有被調用到才會裝載,從而實現了消極式載入 5 */ 6 private static class SingletonHolder{ 7 /** 8 * 靜態初始化器,由JVM來保證安全執行緒 9 */10 private static Singleton instance = new Singleton();11 }12 /**13 * 私人化構造方法14 */15 private Singleton(){16 }17 public static Singleton getInstance(){18 return SingletonHolder.instance;19 }20 }
優點:將懶載入和安全執行緒完美結合的一種方式(無鎖)。(推薦)
備忘:
1. 全域共用,獨一份;
2. 建構函式不暴露(如果暴露便不能保證一份),自己負責自己的構造;
3. 懶漢式:Lazy load,用到才載入,非安全執行緒。如何保證安全執行緒呢:
(1) synchronized getInstance()。
(2)雙重檢查加鎖(volatile)。
4. 餓漢式:一開始就申請好,浪費了點資源,但其安全執行緒。
5. Holder模式:
(1)改成內部類,由JVM保證執行緒安全性。
java 單例模式5種寫法