我们有一个自定义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;
这是正确的方法吗?或者应该删除锁?
答案 0 :(得分:3)
在中间使用锁定进行双重空检查是实例化单例的良好,线程安全的方法。但是,只需说出
就可以节省很多代码public class SPEnvironment : IEnvironment
{
public static SPEnvironment Instance = new SPEnvironment();
private SPEnvironment()
{
try {
.....
}
finally {
......
}
}
}
两者之间的区别在于,此代码在第一次创建该类型的对象时实例化单例,其中您的代码在第一次访问SPEnvironment.Instance
时实例化单例。几乎在所有情况下,这些都是一样的;在大多数剩下的情况下,没关系;但这是一个微妙的区别,值得了解非常罕见的边缘情况。