23種設計模式之單例模式

基本單例模式實現

模式目的:通過該設計模式實現在一定範圍內只存在一個該類的實例對象。
實現原理:通過私有構造方法達到無法外界創建新對象,聲明靜態私有的對象以及公有靜態的getInstance()方法使外界可獲得該對象。
相關注意:存在多線程問題。

package _1_單例模式;

public class Singleton {
    //1、聲明靜態私有對象
    private static Singleton singleton = null;

    //2、將構造函數改變成私有的
    public Singleton() {
    }

    //3、生成一個靜態的公有方法
    /**
     * 存在多線程問題
     * @return
     */
    public static Singleton getInstance(){
        if (singleton == null){
            singleton = new Singleton();
        }
        return singleton;
    }
}

基於多線程優化

1、同步鎖法

package _1_單例模式;

public class Singleton_1 {
    private static Singleton_1 singleton_1 = null;

    public Singleton_1() {
    }

    /**
     * 第一種方式:
     * 同步鎖:可行,但是比較耗資源
     * @return
     */
    public static synchronized Singleton_1 getInstance(){
        if (singleton_1 == null){
            singleton_1 = new Singleton_1();
        }
        return singleton_1;
    }
}

2、先行對象法

package _1_單例模式;

public class Singleton_2 {
    private static Singleton_2 singleton_2 = new Singleton_2() ;

    public Singleton_2() {
    }

    /**
     * 第二種方式:
     * 先行對象:可行,對象不管使不使用都存在,比較耗資源
     * @return
     */
    public static Singleton_2 getInstance(){
        if (singleton_2 == null){
            singleton_2 = new Singleton_2();
        }
        return singleton_2;
    }
}

3、雙重檢查加鎖法

package _1_單例模式;

public class Singleton_3 {
    //添加volatile關鍵字,使該對象線程間可用
    private volatile static Singleton_3 singleton_3 = null;

    public Singleton_3() {
    }

    /**
     * 第三種方式:
     * 雙重檢查加鎖:可行,但是比較耗資源
     * @return
     */
    public static Singleton_3 getInstance(){
        if (singleton_3 == null){
            //添加同步鎖:類上面
            synchronized (Singleton_3.class){
                if (singleton_3 == null){
                    singleton_3 = new Singleton_3();
                }
            }
        }
        return singleton_3;
    }
}

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