1. 程式人生 > >java 設計模式 單例模式

java 設計模式 單例模式

今天自己想要入坑設計模式了,想寫寫部落格記錄自己學習設計模式的一些感悟吧

首先就是單例模式的學習,學習過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