多线程应用程序中没有锁的延迟加载

时间:2014-09-24 15:45:59

标签: c# .net multithreading thread-safety

如果两个线程同时读取此属性会发生什么?

public static HugeType HugeType
{
    get
    {
        if (tenderCache == null)
        {
            tenderCache = Config.Get<HugeType>("HugeType", null);
        }
        return tenderCache;
    }
}

我的对象是只读的,如果创建了两个实例,则它并不重要。我应该在任何情况下添加锁吗?

1 个答案:

答案 0 :(得分:9)

因为没有同步,所以可以多次调用初始化方法,即使其他线程完全完成初始化(由于缺少内存屏障)也是如此。如果您不关心多次执行初始化操作,并且它总是会返回相同的正确值,无论它被调用多少次,即使多次调用它同时进行,那么代码肯定会工作,即使它不会表现得那么好。

话虽如此,实际上确保初始化只进行一次非常很容易,因为它已经解决了问题。您只需在字段中存储Lazy<HugeType>而不是HugeTypeLazy将为您处理初始化同步。