Le code suivant est extrait du modèle (Windows Identity Foundation SDK) que MS utilise pour créer un nouveau site Web de service de jetons de sécurité.Comment lock (syncRoot) a-t-il un sens sur une méthode statique?
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;
}
}
Je suis relativement nouveau dans la programmation multi-thread. Je suppose que la raison de l'instruction lock
est de rendre ce code thread-safe dans le cas où deux demandes Web arrivent sur le site Web en même temps.
Cependant, j'aurais pensé que l'utilisation de lock (syncRoot)
n'aurait pas de sens car syncRoot
fait référence à l'instance actuelle sur laquelle cette méthode opère ... mais c'est une méthode statique!
Comment cela a-t-il un sens?
Où 'syncRoot' est-il défini? – Paolo
@Paolo: C'est une bonne question. Cela dit, je suppose que c'est soit une variable 'static' ou retournée par un Singleton donné son nom. – Powerlord
@Bemrose: L'hypothèse que j'ai faite est que 'syncRoot' est un champ de classe statique qui contient toujours la même instance:' private readonly object syncRoot = nouvel objet(); '. Bien sûr, 'syncRoot' pourrait être défini comme suit:' private object syncRoot {get {return new object(); }} '. Dans ce cas, nous serions en difficulté :-) – Steven