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.
精彩评论