3

以下代码摘自 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 请求同时到达网站的情况下使此代码线程安全。

但是,我会认为 usinglock (syncRoot)没有意义,因为syncRoot指的是该方法正在运行的当前实例......但这是一个静态方法!

这有什么意义?

4

1 回答 1

6

C#lock语句不锁定方法,而是锁定提供给它的对象。在你的情况下syncRoot。因为这个syncRoot对象只有一个实例,这确保了CustomSecurityTokenServiceConfiguration该类只会为该应用程序域创建一次。因此可以并行调用和执行该属性。但是,lock { ... }永远不会并行调用 中的块。但是,它可以被多次调用,这就是额外if (customConfiguration == null)语句在lock块中所做的事情。这种机制称为双重检查锁。

于 2010-05-18T15:22:54.733 回答