我有以下代码,我想知道是否需要锁:
专用静态函数_GetAccountAttributeGroup;
公共静态AccountAttributeGroup GetAccountAttributeGroup( AcbsContainer objectContext,long?)( id)
{ if (id == null) {返回null;} if (_GetAccountAttributeGroup == null) { _GetAccountAttributeGroup = CompiledQuery.Compile((ctx,key) => ctx.AccountAttributeGroups.FirstOrDefault(e> => e.Id == key));}返回_GetAccountAttributeGroup(objectContext,id.Value);}
发布于 2011-06-07 23:11:38
我可能会使用双重检查(例如,检查是否为null;如果为null,则锁定并再次检查;如果仍然为null,则执行编译和分配的工作)。然而,这主要是为了防止在冷启动期间重复工作,而不是其他任何事情.
如果工作量很小(例如,小于编译),我可以使用局部变量来完成这项工作,然后使用Interlocked.CompareExchange来赋值If (并且只有当)字段仍然为null。这意味着所有线程都得到相同的值,但可能意味着重复的工作(除了第一个线程被丢弃)。
如果可能出现这种情况,我实际上会使用一个静态字段初始化器,因为它具有较少的运行时开销;那时不需要锁。
https://stackoverflow.com/questions/6272573
复制相似问题