溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

“Head First 設(shè)計模式“ :單例模式

發(fā)布時間:2020-08-08 18:06:26 來源:網(wǎng)絡(luò) 閱讀:359 作者:u2r2otkit 欄目:軟件技術(shù)

單例模式


定義:保證一個類僅有一個實例,并提供一個訪問它的全局訪問點。類圖如下:

“Head First 設(shè)計模式“ :單例模式


代碼實現(xiàn)如下:

public class Singleton {
    // 用靜態(tài)變量來記錄唯一的實例
    private static Singleton instance;
    /**
     * 構(gòu)造方法私有化,防止被創(chuàng)建,只能類內(nèi)部能使用構(gòu)造器
     */
    private Singleton() { }
    /**
     * 實例化對象,并返回這個對象
     * @return
     */
    public static Singleton getInstance() {
        if (instance == null) {
                instance = new Singleton();
        }
        return instance;
    }
    // 其他的方法
}

并發(fā)環(huán)境下上面的代碼會出現(xiàn)問題的,我們進一步修改,如下:

/**
 * 實例化對象,并返回這個對象
 * synchronized加鎖,可能對性能有影響哦
 * @return
 */
public static synchronized SingletonThread getInstance() {
    if (instance == null) {
                instance = new SingletonThread();
    }
    return instance;
}

上面例子對性能很大的影響,那我們可以進一步改善嗎?


  1. 如果getInstance()的性能對應(yīng)用程序不是很關(guān)鍵,就什么都別做,不要改善了

  1. 使用“急切”創(chuàng)建實例,而不用延遲實例化的做法,代碼如下:
public class Singleton3 {
  // 靜態(tài)屬性,類加載時初始化的,JVM保證唯一
  private static Singleton3 instance = new Singleton3();
    private Singleton3() { }
    public static Singleton3 getInstance() {
        return instance;
    }
}

  1. 使用“雙重檢查加鎖”,在getInstance()中減少使用同步,不適合JDK1.4之前的版本,代碼如下;
public class Singleton4 {
  // 用靜態(tài)變量來記錄唯一的實例, volatile多線程環(huán)境下保用最新的值
  private volatile static Singleton4 instance;
    /**
     * 構(gòu)造方法私有化,防止被創(chuàng)建,只能類內(nèi)部能使用構(gòu)造器
     */
    private Singleton4() {
    }
    /**
     * 實例化對象,并返回這個對象
     * @return
     */
    public static Singleton4 getInstance() {
        if (instance == null) {
            synchronized (Singleton4.class) {
                if (instance == null) {
                    instance = new Singleton4();
                }
            }
        }
        return instance;
    }
    // 其他的方法
}

注意:有多個類加載器時,單利可能產(chǎn)生多個哦,這個要注意哦。

單例模式的應(yīng)用場景:

  • 應(yīng)用中某個實例對象需要頻繁的被訪問。
  • 應(yīng)用中每次啟動只會存在一個實例。如賬號系統(tǒng),數(shù)據(jù)庫系統(tǒng)。
向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI