如果两个线程同时读取此属性会发生什么?
public static HugeType HugeType
{
get
{
if (tenderCache == null)
{
tenderCache = Config.Get<HugeType>("HugeType", null);
}
return tenderCache;
}
}
我的对象是只读的,如果创建了两个实例,则它并不重要。我应该在任何情况下添加锁吗?
答案 0 :(得分:9)
因为没有同步,所以可以多次调用初始化方法,即使其他线程完全完成初始化(由于缺少内存屏障)也是如此。如果您不关心多次执行初始化操作,并且它总是会返回相同的正确值,无论它被调用多少次,即使多次调用它同时进行,那么代码肯定会工作,即使它不会表现得那么好。
话虽如此,实际上确保初始化只进行一次非常很容易,因为它已经解决了问题。您只需在字段中存储Lazy<HugeType>
而不是HugeType
,Lazy
将为您处理初始化同步。