Я был убежден, что если несколько потоков могут получить доступ к переменной, тогда все чтения и записи на эту переменную должны быть защищены кодом синхронизации, таким как оператор блокировки, потому что процессор может переключиться на другой нить на полпути через запись.
Тем не менее, я просматривал System.Web.Security.Membership, используя Reflector, и нашел код следующим образом:
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;
}
}
}
Почему поле s_Initialized считывается за пределами блокировки? Не мог ли другой поток попытаться написать ему одновременно? Является ли чтение и запись переменных атомами?