C#中執行個體Singleton

來源:互聯網
上載者:User

標籤:des   style   blog   http   color   使用   

C#中執行個體Singleton

1、經典方案:

using System; public class Singleton {    private static Singleton instance;    private Singleton() {}    public static Singleton Instance    {       get        {          if (instance == null)          {             instance = new Singleton();          }          return instance;       }    } } 

該實現主要有兩個優點:

  • 由於執行個體是在 Instance 屬性方法內部建立的,因此類可以使用附加功能(例如,對子類進行執行個體化),即使它可能引入不想要的依賴性。

  • 直到對象要求產生一個執行個體才執行執行個體化;這種方法稱為"懶執行個體化"。懶執行個體化避免了在應用程式啟動時執行個體化不必要的 singleton

但是,這種實現的主要缺點是在多線程環境下它是不安全的。如果執行過程的不同線程同時進入 Instance 屬性方法,那麼可能會建立多個 Singleton 對象執行個體。每個線程都會執行下列語句,並決定必須建立新的執行個體:

if (instance == null) 

2、Double-Check Locking

using System; public sealed class Singleton {    private static volatile Singleton instance;    private static object syncRoot = new Object();    private Singleton() {}    public static Singleton Instance    {       get        {          if (instance == null)           {             lock (syncRoot)              {                if (instance == null)                    instance = new Singleton();             }          }          return instance;       }    } } 

  此方法確保了僅在需要執行個體時才會建立僅一個執行個體。此外,變數被聲明為 volatile,以確保只有在執行個體變數分配完成後才能訪問執行個體變數。最後,此方法使用 syncRoot 執行個體來進行鎖定(而不是鎖定類型本身),以避免發生死結。

3、靜態初始化

public sealed class Singleton {    private static readonly Singleton instance = new Singleton();    private Singleton(){}    public static Singleton Instance    {       get        {          return instance;        }    } } 

  該實現與前面的樣本類似,不同之處在於它依賴公用語言運行庫來初始設定變數。它仍然可以用來解決 Singleton 模式試圖解決的兩個基本問題:全域訪問和執行個體化控制。公用靜態屬性為訪問執行個體提供了一個全域訪問點。此外,由於建構函式是私人的,因此不能在類本身以外執行個體化 Singleton 類;因此,變數引用的是可以在系統中存在的唯一的執行個體。

  由於 Singleton 執行個體被私人靜態成員變數引用,因此在類首次被對 Instance 屬性的調用所引用之前,不會發生執行個體化。因此,與 Design Patterns 形式的 Singleton 一樣,該解決方案實現了懶執行個體化屬性的一種形式。

  這種方法唯一的潛在缺點是,您對執行個體化機制的控制權較少。在 Design Patterns 形式中,您能夠在執行個體化之前使用非預設的建構函式或執行其他任務。由於在此解決方案中由 .NET Framework 負責執行初始化,因此您沒有這些選項。在大多數情況下,靜態初始化是在 .NET 中實現 Singleton 的首選方法。此樣本中通過運行庫來保證安全執行緒。

 

在 C# 中實現 Singleton 具有下列優缺點:

優點

  • 由於 .NET Framework 顯式地指定靜態變數初始化如何以及何時發生,因此靜態初始化方法是可能的。

  • 列的前面的"多線程 Singleton"中所描述的 Double-Check Locking 技術已在公用語言運行庫中正確實現。

 

參考:http://msdn.microsoft.com/zh-cn/library/ff650316.aspx

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.