我一直认为,如果多个线程可以访问一个变量,那么该变量的所有读取和写入操作都必须受到同步代码的保护,例如“ lock”语句,因为处理器可能会在中途切换到另一个线程写。
但是,我正在使用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字段?另一个线程无法尝试同时写入吗?变量的读写是原子的吗?
DIEA
偶然的你
相关分类