2

次のコードがあるとします
。 1. ダブル チェック ロックを使用する理由、シングル ロックでは不十分な理由、詳細な例を提供してください。
2. この実装の主な欠点は何ですか? どうやってそれを証明すればよいですか?
ありがとう。

 public sealed class SomeSingleton5  
{  
    private static SomeSingleton5 s_Instance = null;
    private static object s_LockObj = new Object();

    private SomeSingleton5() { }

    public static SomeSingleton5 Instance
    {
        get
        {
            if (s_Instance == null)
            {
                lock (s_LockObj)
                {
                    if (s_Instance == null)
                    {
                        s_Instance = new SomeSingleton5();
                    }
                }
            }

            return s_Instance;
        }
    }
}
4

2 に答える 2

8

シングルトンクラスの最良の実装はによって提供されると思いますJon Skeet

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

JonSkeetによるシングルトンの明確化

于 2012-07-04T11:31:03.427 に答える
2
  1. ロックの取得にはコストがかかります。最初のチェックがなければ、誰かがシングルトンにアクセスするたびif(s_Instance == null)にロックが取得されます。しかし、実際にはロックが必要なのはインスタンスの作成時だけです。したがって、最初の方法は不要なロックを防ぎます。最初に 2 つのスレッドが最初のスレッドを評価した可能性があり、その後 2 つのスレッドがロック内で互いにインスタンス化するため、2 番目のスレッドが存在する必要があります。if(s_Instance == null)if(s_Instance == null)if(s_Instance == null)trues_Instance
  2. あなたの実装に実際の欠点は見当たりませんが、代替 (静的コンストラクター、以下を参照) を使用すると、より単純でコードが少ないソリューションが得られます。そのため、保守性が高く、エラーが発生しにくくなっています。また、ロックはまったく必要ありません。前述したように、ロックにはコストがかかります。

静的コンストラクターを使用して改善できます。

public sealed class SomeSingleton5  
{  
    // the compiler will generate a static constructor containing the following code 
    // and the CLR will call it (once) before SomeSingleton5 is first acccessed
    private static SomeSingleton5 s_Instance = new SomeSingleton5();

    private SomeSingleton5() { }

    public static SomeSingleton5 Instance
    {
        get
        {
            return s_Instance;
        }
    }
}
于 2012-07-04T11:29:37.457 に答える