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

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

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

最佳答案

因为您没有同步,所以有可能多次调用初始化方法,即使其他线程已经完全完成了初始化(由于缺少内存屏障)也有可能。如果您不关心多次执行初始化操作,并且无论调用多少次,即使同时进行多次调用,它都将始终返回相同的正确值,那么即使它执行了,代码也肯定会起作用效果不佳。

话虽如此,鉴于已经已经解决了一个问题,实际上正确地确保初始化仅执行一次非常容易。您可以简单地在字段中存储Lazy<HugeType>而不是HugeType,并且Lazy将为您完成初始化同步。

关于c# - 在多线程应用程序中无锁的延迟加载,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26021197/

10-10 17:32