J'ai été élevé à croire que si plusieurs threads peuvent accéder à une variable, toutes les lit et écrit sur cette variable doit être protégée par le code de synchronisation, comme un "verrou", parce que le processeur peut passer à un autre thread à mi-chemin par le biais de l'écriture.
Cependant, j'ai été à la recherche par le biais de Système.Web.De sécurité.L'adhésion à l'aide de Réflecteur et trouvé un code comme ceci:
public static class Membership
{
private static bool s_Initialized = false;
private static object s_lock = new object();
private static MembershipProvider s_Provider;
public static MembershipProvider Provider
{
get
{
Initialize();
return s_Provider;
}
}
private static void Initialize()
{
if (s_Initialized)
return;
lock(s_lock)
{
if (s_Initialized)
return;
// Perform initialization...
s_Initialized = true;
}
}
}
Pourquoi le s_Initialized champ de lecture à l'extérieur de la serrure? Ne pouvait pas un autre thread être en train d'essayer d'écrire en même temps? Sont lit et écrit des variables atomiques?