java 設計模式 單例模式
阿新 • • 發佈:2018-12-21
今天自己想要入坑設計模式了,想寫寫部落格記錄自己學習設計模式的一些感悟吧
首先就是單例模式的學習,學習過java的對這個模式應該不會陌生,分別是兩種模式,餓漢式(類載入的時候建立物件),懶漢式(呼叫方法的時候建立物件),從名字大概就知道他們在什麼時候建立物件了
這裡我就直接上程式碼了
package com.lyf.single; /** * 懶漢式,物件被呼叫時才去建立 * 單例 * 1.建構函式私有化 * 2.靜態方法獲取物件 */ public class SingleLazy { private static SingleLazy single; private SingleLazy() { } public static SingleLazy getSingle() { if (single == null) { /** * 多執行緒訪問下,可能 if 同時滿足條件,新增鎖 */ synchronized (SingleLazy.class) { // 雙重檢測 if (single == null) { single = new SingleLazy(); } } } return single; } }
我們先分析懶漢式:單例模式 1)構造方法私有化 2)物件私有化, 這樣外部類,方法就不能用 new 關鍵字來產生物件了,
所以我們要在getSingle 方法前加上 static 關鍵字,通過類名.getSingle 呼叫生產物件,既然是單例模式,那就只能存在一個物件,所以方法先判斷,如果物件為 null 才去建立物件。加上鎖關鍵字是因為考慮到多執行緒下,假設執行緒A,執行緒B同時呼叫方法,此時他們兩個的single都是null,這時候就會建立兩個物件,就不符合單例模式思想了,在 synchronized 鎖內,又有if雙重判斷,這還是因為多執行緒下,執行緒A,執行緒B,假設A 進入,拿到鎖,執行緒B等待,A建立完成之後,B執行緒的 single 還是為null,這時候就又會建立,那這樣就建立了兩個物件,不符合單例模式的思想了。大家也可以藉助畫圖輔助來進行理解
接下來介紹餓漢式,其實就是沒呼叫方法前就建立了物件,體現出“餓”
package com.lyf.single;
public class SingleHungry {
/**
* 在類載入時就被例項化
*/
private static SingleHungry single = new SingleHungry();
private SingleHungry() {}
public static SingleHungry getSingleHungry() {
return single;
}
}
在類載入的時候就建立了物件,這種就是比較簡單,看起來也是很容易理解
測試程式碼
package com.lyf.single;
public class Test {
public static void main(String[] args) {
// SingleLazy single = new SingleLazy();
// SingleLazy single1 = SingleLazy.getSingle();
// SingleLazy single2 = SingleLazy.getSingle();
SingleHungry single1 = SingleHungry.getSingleHungry();
SingleHungry single2 = SingleHungry.getSingleHungry();
System.out.println(single1 == single2);
}
}
返回結果都是 true,你自己也可以用多執行緒去測試,當然返回結果還是true