C# · 12月 29, 2021

c# – 在多线程应用程序中无锁的Lazy加载

如果两个线程同时读取此属性会发生什么? public static HugeType HugeType{ get { if (tenderCache == null) { tenderCache = Config.Get<HugeType>(“HugeType”,null); } return tenderCache; }}

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

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

话虽如此,实际上确保初始化只做一次是很容易的,因为它已经是一个解决的问题.您可以简单地存储一个Lazy< HugeType>在你的字段中,而不是一个HugeType和Lazy将会为您处理初始化同步.