C#のインスタンスSingleton

5997 ワード

【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; 
      } 
   } 
} 

この実装には主に2つの利点があります.
  • インスタンスは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; 
          } 
       } 
    } 

    この方法では、インスタンスが必要な場合にのみ1つのインスタンスが作成されることを保証します.さらに、変数はvolatileとして宣言され、インスタンス変数の割り当てが完了した後にのみインスタンス変数にアクセスできることを確認します.最後に、このメソッドではsyncRootインスタンスを使用して、ロックタイプ自体ではなくsyncRootインスタンスをロックし、デッドロックを回避します.
    3、静的初期化
    public sealed class Singleton 
    { 
       private static readonly Singleton instance = new Singleton(); 
       private Singleton(){} 
       public static Singleton Instance 
       { 
          get  
          { 
             return instance;  
          } 
       } 
    } 

    このインプリメンテーションは、共通言語実行ライブラリに依存して変数を初期化する点で、前の例と同様です.Singletonモードが解決しようとする2つの基本的な問題:グローバルアクセスとインスタンス化制御を解決するためにも使用できます.共通の静的プロパティは、アクセス・インスタンスにグローバル・アクセス・ポイントを提供します.また、コンストラクション関数はプライベートであるため、クラス自体以外で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