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() {}
}

由 Jon Skeet 澄清的单身人士

于 2012-07-04T11:31:03.427 回答
2
  1. 获取锁是昂贵的。如果没有第一次检查,每次有人访问单例时if(s_Instance == null)都会获得一个锁。但实际上只需要在实例创建期间有一个锁。所以第一个防止不必要的锁定。第二个需要在那里,因为最初两个线程可能已经评估了第一个,然后两个线程将在锁内相互实例化。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 回答