以下代码摘自MS用于创建新安全令牌服务网站的(Windows Identity Foundation SDK)模板。
public static CustomSecurityTokenServiceConfiguration Current
{
get
{
var key = CustomSecurityTokenServiceConfigurationKey;
var httpAppState = HttpContext.Current.Application;
var customConfiguration = httpAppState.Get(key)
as CustomSecurityTokenServiceConfiguration;
if (customConfiguration == null)
{
lock (syncRoot)
{
customConfiguration = httpAppState.Get(key)
as CustomSecurityTokenServiceConfiguration;
if (customConfiguration == null)
{
customConfiguration =
new CustomSecurityTokenServiceConfiguration();
httpAppState.Add(key, customConfiguration);
}
}
}
return customConfiguration;
}
}
我对多线程编程比较陌生。我假设lock
语句的原因是,如果两个Web请求同时到达Web站点,则此代码是线程安全的。
但是,我原以为使用lock (syncRoot)
没有意义,因为syncRoot
引用了此方法正在运行的当前实例......但这是一个静态方法!
这有什么意义?
答案 0 :(得分:6)
C#lock
语句不会锁定方法,而是锁定它所提供的对象。在您的情况下syncRoot
。由于此syncRoot
对象只有一个实例,因此可确保只为该应用程序域创建一次CustomSecurityTokenServiceConfiguration
类。因此可以调用属性并并行执行。但是,lock { ... }
中的块永远不会被并行调用。但是,它可以被多次调用,这就是额外的if (customConfiguration == null)
语句在lock
块中所做的事情。这种机制称为双重检查锁。