小桐學設計模式 單例模式

2021-07-03 23:13:36 字數 1009 閱讀 6116

單例模式分為兩種,懶漢式和餓漢式。首先看懶漢式:

public class a()

public static a getinstance()

return a;

}}

再來看餓漢式。

public class a()

public static a getinstance()

}

懶漢式在執行getinstance方法時,判斷條件成立才會例項化物件,餓漢式則在類建立時就例項化物件。

很多時候,單例模式還要考慮多執行緒的問題,餓漢式本身就是執行緒安全的(測試了a可以不加final,不過加上更直觀),而懶漢式則不是執行緒安全的。因為執行緒執行順序不確定,假設剛好了幾個執行緒同時訪問,這幾個執行緒檢測到a都是null,就會建立多個物件。解決這個問題很簡單,只要加鎖就可以了。

public synchronized static a getinstance()

return a;

}

這樣寫基本就沒問題了,不過我們還可以對加鎖的位置進行優化,對整個函式加鎖雖然方便,但效能並不是最優的,我們真正需要加鎖的其實只有if語句塊,所以我們可以只在這個位置加鎖。

public static a getinstance()

}return a;

}

寫到這裡,你會想,好了,效能優化也完成了,但真是這樣嗎。再細心分析,雖然我們將鎖的範圍縮小了,可是考慮到這裡本來就只有三條語句,我們僅僅這樣寫,其實和之前對整個函式加鎖是差不多的。仔細分析就會發現,我們每次執行方法,執行緒都會持有鎖,而不管a是不是已經建立了。我們可以針對這點再優化,只有a為空的時候才持有鎖。

public static a getinstance()

}}

return a;

}

這樣就不必每次執行都持有鎖,提高了效能。這種技巧叫做雙重鎖定,大家可以去查一下。

小白學設計模式 單例模式(singleton)

乙個類有且僅有乙個全域性例項,並且提供乙個訪它的全域性訪問點。單例模式讓自身儲存自己的唯一例項,使得這個類保證沒有其他例項可以被建立,從而提供乙個訪問該例項的方法。singleton 定義乙個instance操作,允許客戶訪問他的唯一例項,instance是乙個類操作,它可能負責建立他自己的唯一例項...

小話設計模式(一)單例模式

那麼具體要求是什麼樣的呢?簡而言之,在程式執行期間,單例類的例項只能有乙個 或沒有 恩?說好的是類似於全域性變數的東西呢?當然為了能在程式任何地方呼叫它,需要為它實現乙個靜態方法 例如getinstance 通過這個方法可以獲得單例類的唯一例項。廢話不多說直接上c public class sing...

小話設計模式二 單例模式

單例模式定義 只有乙個例項,單例模式確保某乙個類只有乙個例項,而且自行例項化並向整個系統提供這個例項。這個類稱為單例類。單例模式特點 1 這個類只能有乙個例項 2 這個類必須自行建立這個例項 3 這個類必須自行向整個系統提供這個例項 單例模式解析 下面是單例模式的uml圖 下面是簡單 實現 單例模式...