我一直相信,如果多个线程可以访问一个变量,那么对该变量的所有读取和写入都必须受到同步代码的保护,例如“锁定”语句,因为处理器可能会在中途切换到另一个线程一个写。
但是,我正在使用 Reflector 查看 System.Web.Security.Membership 并找到如下代码:
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 字段在锁之外读取?其他线程不能同时尝试写入它吗?变量的读写是原子的吗?