Я был убежден, что если несколько потоков могут получить доступ к переменной, тогда все чтения и записи на эту переменную должны быть защищены кодом синхронизации, таким как оператор блокировки, потому что процессор может переключиться на другой нить на полпути через запись.
Тем не менее, я просматривал 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 считывается за пределами блокировки? Не мог ли другой поток попытаться написать ему одновременно? Является ли чтение и запись переменных атомами?
