1. 程式人生 > WINDOWS開發 >c# 單例模式

c# 單例模式

1.Double-Checked Locking
public static Singleton3 Instance
{
get
{
// Double-Check 雙重判斷避免不必要的加鎖
if (instance == null)
{
// 確定例項為空時再等待加鎖
lock (syncObject)
{
// 確定加鎖後例項仍然未建立
if (instance == null)
{
instance = new Singleton3();
}
}
}

        return instance;
    }
}

加鎖機制來確保在多執行緒環境下只建立一個例項,並且用兩個if判斷來提高效率。
2.利用靜態建構函式
public sealed class Singleton4
{
private Singleton4() { }
// 在大多數情況下,靜態初始化是在.NET中實現Singleton的首選方法。
static Singleton4() { }

    private static readonly Singleton4 instance = new Singleton4();

    public static Singleton4 Instance
    {
        get
        {
            return instance;
        }
    }
}

在使用靜態建構函式的時候應該注意幾點:

  1、靜態建構函式既沒有訪問修飾符,也沒有引數。因為是.NET呼叫的,所以像public和private等修飾符就沒有意義了。
  
  2、是在建立第一個類例項或任何靜態成員被引用時,.NET將自動呼叫靜態建構函式來初始化類,也就是說我們無法直接呼叫靜態建構函式,也就無法控制什麼時候執行靜態構造函數了。

  3、一個類只能有一個靜態建構函式。

  4、無引數的建構函式可以與靜態建構函式共存。儘管引數列表相同,但一個屬於類,一個屬於例項,所以不會衝突。

  5、最多隻執行一次。

  6、靜態建構函式不可以被繼承。

  7、如果沒有寫靜態建構函式,而類中包含帶有初始值設定的靜態成員,那麼編譯器會自動生成預設的靜態建構函式。
3. 內部類(懶漢模式)
public sealed class Singleton5
{
private Singleton5() { }

    public static Singleton5 Instance
    {
        get
        {
            return Nested.instance;
        }
    }

    // 使用內部類+靜態建構函式實現延遲初始化
    class Nested
    {
        static Nested() { }

        internal static readonly Singleton5 instance = new Singleton5();
    }
}

參考:
https://www.cnblogs.com/leolion/p/10241822.html
https://www.cnblogs.com/edisonchou/p/4735373.html
https://www.cnblogs.com/87700180/p/11865597.html
https://www.cnblogs.com/michaelxu/archive/2007/03/29/693401.html