如果两个线程同时读取该属性,将会发生什么?
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/