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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章