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