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

Iev*_*ida 10 .net c# multithreading thread-safety

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

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

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

Ser*_*rvy 9

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

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

  • @Blam如果两者都尝试写入值,那么一个将获胜;假设初始化总是创建相同的值,则意味着谁获胜并不重要。对引用类型的变量的写操作是原子的,因此,如果在另一个线程尝试向其写入值时正在读取该值,则要么在写操作之前进行读操作,要么在读操作之前进行写操作,这是唯一的选择。获得垃圾或“世界终结”是不可能的。 (2认同)