Следующий код извлекается из шаблона (Windows Identity Foundation SDK), который MS использует для создания нового веб-сайта службы маркеров безопасности.
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
состоит в том, чтобы сделать этот код потокобезопасным в случае, когда два веб-запроса поступают на веб-сайт одновременно.
Однако я бы подумал, что использование lock (syncRoot)
не имеет смысла, поскольку syncRoot
относится к текущему экземпляру, на котором работает этот метод ... но это статический метод!
Как это имеет смысл?