標籤: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 對象執行個體。每個線程都會執行下列語句,並決定必須建立新的執行個體:
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 具有下列優缺點:
優點
參考:http://msdn.microsoft.com/zh-cn/library/ff650316.aspx