我已经被认为如果多个线程可以访问变量,那么所有对该变量的读取和写入都必须受到同步代码的保护,例如"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;
}
}
}
Run Code Online (Sandbox Code Playgroud)
为什么s_Initialized字段在锁外读取?另一个线程难道不能同时写入它吗?变量的读写是否是原子的?
我看过很多懒加载的例子 - 你有什么选择?
给定一个模型类,例如:
public class Person
{
private IList<Child> _children;
public IList<Child> Children
{
get {
if (_children == null)
LoadChildren();
return _children;
}
}
}
Run Code Online (Sandbox Code Playgroud)
Person类不应该知道它是如何被装载的......或者它应该是什么?当然它应该控制何时填充属性?
您是否有一个将Person与其子集合耦合在一起的存储库,或者您是否会使用不同的方法,例如使用lazyload类 - 即便如此,我也不希望在我的模型体系结构中使用lazyload类模糊.
如果首先请求一个Person然后它的子节点(即在这个例子中不是延迟加载)或者以某种方式延迟加载,你将如何处理性能.
这一切都归结为个人选择吗?