單例模式解決的問題:保證一個類僅有一個實例,並提供一個訪問它的全局訪問點
多線程時雙重鎖定的單例模式:
- class Singletion
- {
- private static Singletion instance;
- private static readonly object syncRoot = new object();
- private Singletion() { }
- public static Singletion GetInstan()
- {
- if (instance == null)
- {
- lock (syncRoot)
- {
- if (instance == null)
- {
- instance = new Singletion();
- }
- }
- }
- return instance;
- }
- }
為什么有兩處if(instance==null)? --當為null時並且同時有2個線程調用GetInstan()時,它們將都可以通過第一重的判斷,然后由於lock機制,一個線程進入排隊,當第一個線程出來后如果沒有第二層判斷將重新創建
靜態化下多線程時的單利模式:
/// <summary>
/// sealed修飾符可以應用於類、實例方法和屬性。密封類不能被繼承
/// </summary>
/// sealed修飾符可以應用於類、實例方法和屬性。密封類不能被繼承
/// </summary>
- public sealed class Singletion
- {
- private static readonly Singletion instance = new Singletion();
- private Singletion() { }
- public static Singletion GetInstan()
- {
- return instance;
- }
- }
這樣寫依賴於公共語言運行庫來初始化變量,由於構造函數是私有的所以不能在類本身以外實例化Singletion類;因此變量的引用的是可以在系統中存在的唯一實例。這種方式是在自己被加載時就將自己實例化,所以被稱為餓漢式單利模式;原先的要在第一次被引用時才會將自己實例化被稱為懶漢示
