C# 在HTTPModule的Static属性中锁定静态对象

C# 在HTTPModule的Static属性中锁定静态对象,c#,programming-languages,locking,C#,Programming Languages,Locking,我们实现了一个自定义DLLIHttpModule来处理httpApplication\u EndRequest,我想知道的是 DLL有一个类(不是静态类),该类有一个静态属性,用于为类内定义的静态变量/对象引用创建实例 现在,在为静态对象/变量创建实例之前,是否需要锁定内部静态属性 例如:- 我将从另一个类调用这个,如下所示 SPEnvironment.Instance; 这条路对吗?还是应该删除锁?< P>中间有锁的双空校验是一个很好的线程安全的实例化单例的方法。但是,只要说一句话,就可以节

我们实现了一个自定义DLL
IHttpModule
来处理
httpApplication\u EndRequest
,我想知道的是

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

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

例如:-

我将从另一个类调用这个,如下所示

SPEnvironment.Instance;

这条路对吗?还是应该删除锁?

< P>中间有锁的双空校验是一个很好的线程安全的实例化单例的方法。但是,只要说一句话,就可以节省大量代码

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

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

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

这个类有一个私有构造函数。DLL用于web应用程序,我是否仍然需要锁定signleton对象?@CrazyNick-为了回答您的第一个问题,我已经更正了我的代码;很抱歉第二,是的。如果不锁定对象并再次检查null,则两个线程可以检查
\u instance
是否为null,找到它,然后实例化该对象。这对您可能无关紧要,因为第一个将被丢弃,但这确实意味着它将不是真正的单例。由于这是一个静态引用,是否可能为同一个对象引用拥有一个重复的对象?否,但两个线程可能同时调用实例属性并创建意外结果。阅读此讨论了解更多详细信息
public class SPEnvironment : IEnvironment
{
    public static SPEnvironment Instance = new SPEnvironment();

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