[英]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.