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

时间:2010-12-25 10:32:27

标签: c# programming-languages locking

我们有一个自定义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;

这是正确的方法吗?或者应该删除锁?

1 个答案:

答案 0 :(得分:3)

在中间使用锁定进行双重空检查是实例化单例的良好,线程安全的方法。但是,只需说出

就可以节省很多代码
public class SPEnvironment : IEnvironment
{
    public static SPEnvironment Instance = new SPEnvironment();

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

两者之间的区别在于,此代码在第一次创建该类型的对象时实例化单例,其中您的代码在第一次访问SPEnvironment.Instance时实例化单例。几乎在所有情况下,这些都是一样的;在大多数剩下的情况下,没关系;但这是一个微妙的区别,值得了解非常罕见的边缘情况。