开发者

How does lock(syncRoot) make sense on a static method?

The following code is excerpted from the (Windows Identity Foundation SDK) template that MS uses to create a new Security Token Service Web Site.

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;  
    }
}

I'm relatively new to multi开发者_JAVA百科-threaded programming. I assume that the reason for the lock statement is to make this code thread-safe in the event that two web requests arrive at the web site at the same time.

However, I would have thought that using lock (syncRoot) would not make sense because syncRoot refers to the current instance that this method is operating on... but this is a static method!

How does this make sense?


The C# lock statement does not lock on a method, but on the object it is supplied to. In your case syncRoot. Because there is only one instance of this syncRoot object, this ensures the CustomSecurityTokenServiceConfiguration class will only get created once for that app domain. So the property can be called in and executed in parallel. However, the block within the lock { ... } will never be called in parallel. However, it can be called multiple times and that is what the extra if (customConfiguration == null) statement is doing within the lock block. This mechanism is called a double checked lock.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜