繁体   English   中英

将静态对象锁定在HTTPModule的static属性中

[英]Locking the Static object inside the static property in the HTTPModule

我们有一个自定义的DLL实现的IHttpModule来处理httpApplication_EndRequest ,我想知道的是

DLL具有一个具有静态属性的类(不是静态类),该类用于为该类内部定义的静态变量/对象引用创建实例。

现在,在为静态对象/变量创建实例之前,我是否需要锁定静态属性?

例如:-

public class SPEnvironment : IEnvironment
{
    private static SPEnvironment _instance;
    private static object _syncRoot = new object();

    private SPEnvironment()
    {
        try {
        .....
        }
        finally {
        ......
        }
    }

    public static SPEnvironment Instance
    {
        get
        {
            if (_instance == null)
            {
                lock (_syncRoot)
                {
                    if (_instance == null)
                    {
                        _instance = new SPEnvironment();
                    }
                }
            }
            return _instance;
        }
    }
}

我将在另一个类中调用它,如下所示

SPEnvironment.Instance;

这是正确的方法吗? 还是应该取下锁?

中间带锁的double null检查是实例化单例的一种线程安全的好方法。 但是,您只需要说一下就可以节省很多代码

public class SPEnvironment : IEnvironment
{
    public static SPEnvironment Instance = new SPEnvironment();

    private SPEnvironment()
    {
        try {
        .....
        }
        finally {
        ......
        }
    }
}

两者之间的区别在于,此代码在首次创建该类型的对象时实例化单例,而您的代码在首次访问SPEnvironment.Instance将实例化单例。 在几乎所有情况下,这些都是同一件事。 在其余大多数情况下,这并不重要; 但是对于这种非常罕见的边缘情况,这是一个微妙的区别,值得我们理解。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM