首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >锁(SyncRoot)对静态方法有什么意义?

锁(SyncRoot)对静态方法有什么意义?
EN

Stack Overflow用户
提问于 2010-05-18 23:18:17
回答 1查看 1.7K关注 0票数 3

以下代码摘自MS用来创建新的安全令牌服务网站的(Windows Identity Foundation SDK)模板。

代码语言:javascript
复制
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指的是此方法正在操作的当前实例……但这是一个静态方法!

这有什么意义呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-05-18 23:22:55

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

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2858597

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档