複数のスレッドが変数にアクセスできる場合、プロセッサが途中で別のスレッドに切り替わる可能性があるため、その変数からのすべての読み取りとその変数への書き込みは、「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フィールドがロックの外部で読み取られるのはなぜですか?別のスレッドが同時にそれに書き込もうとしていませんか?変数の読み取りと書き込みはアトミックですか?