注意:公共語言運行庫解決了在其他環境中常見的、與使用 Double-Check Locking 有關的問題。
下面的實現僅允許一個線程在尚未 創建 Singleton 實例的情況下進入關鍵區域(該區域由 lock 塊標識)。
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 實例來進行鎖定(而不是鎖定類型本 身),以避免發生死鎖。
此 double-check locking 方法解決了線程並發 問題,同時避免在每個 Instance 屬性方法的調用中都出現獨占鎖定。它還允許 您將實例化延遲到第一次訪問對象時發生。實際上,應用程序很少需要這種類型 的實現。大多數情況下,靜態初始化方法已經夠用。
在 C# 中實現 Singleton 具有下列優缺點:
優點
• 由於 .Net Framework 顯式地指定靜態變量初始化如何以及何時發生,因此靜態初始化方法是可能的。
• 列的前面的"多線程 Singleton"中所描述的 Double- Check Locking 技術已在公共語言運行庫中正確實現。
缺點
如果 您的多線程應用程序需要進行顯式初始化,那麼必須采取措施以避免線程問題。