在多线程应用程序中使用Singleton有什么危险

Bob*_*tor 9 .net c# singleton multithreading

我正在寻找在多线程Win服务中使用单例进行日志记录,并想知道我可能遇到的一些问题.我已经设置了get实例来处理同步

    private static volatile Logging _instance;
    private static object _syncRoot = new object();

    private Logging(){}
    public static Logging Instance
    {
        get
        {
            if (_instance==null)
            {
                lock(_syncRoot)
                {
                    if (_instance == null)
                    {
                        _instance = new Logging();
                    }
                }
            }
            return _instance;
        }
    }
Run Code Online (Sandbox Code Playgroud)

还有什么我可能需要担心的吗?

Mic*_*odd 13

这看起来对我很好.

有关详细信息,请参阅在C#中实现单例模式.

编辑:可能应该把回报放在锁内.


Jon*_*eet 12

这比其他任何信息更具信息性.

您发布的是双重检查锁定算法 - 据我所知,您发布的内容起作用.(从Java 1.5开始,它也适用于那里.)然而,它非常脆弱 - 如果你有任何不妥之处,你可以引入非常微妙的竞争条件.

我通常更喜欢在静态初始化器中初始化单例:

public class Singleton
{
    private static readonly Singleton instance = new Singleton();

    public static Singleton Instance
    {
        get { return instance; }
    }

    private Singleton()
    {
        // Do stuff
    }
}
Run Code Online (Sandbox Code Playgroud)

(如果你想要一点额外的懒惰,可以添加一个静态构造函数.)

这种模式更容易正确,在大多数情况下它也同样如此.

我的C#单例实现页面上有更多细节(也由Michael链接).

至于危险 - 我说最大的问题是你失去了可测试性.对于伐木来说可能不算糟糕.