C#懒惰和竞赛初始化?
(在问了
this related question 之后,我还有一个问题.)
使用Lazy< T>的整个想法(AFAIK).,是仅在我们需要时才创建对象. 我想要的最后一件事是,将创建昂贵的对象> 1次. 我不在乎许多线程最终会产生相同的引用.我只是不希望他们创建多个实例. 所以Lazyinitializer通过syncLock处理这个: LazyInitializer.EnsureInitialized (ref _expensive,ref useless,ref _sync,() => new Expensive()); 但是Lazy< T>是什么?可以处理吗? 我错过了什么? 解决方法
你在问懒惰是如何在内部工作的吗?根据
MSDN documentation,Lazy确保只创建一个:
如果您实际上询问它是如何在内部工作的,那么它似乎正在使用某种锁: object obj = Volatile.Read<object>(ref this.m_threadSafeObj); bool flag = false; try { if (obj != Lazy<T>.ALREADY_INVOKED_SENTINEL) { Monitor.Enter(obj,ref flag); } if (this.m_boxed == null) { boxed = this.CreateValue(); this.m_boxed = boxed; Volatile.Write<object>(ref this.m_threadSafeObj,Lazy<T>.ALREADY_INVOKED_SENTINEL); } else { boxed = (this.m_boxed as Lazy<T>.Boxed); if (boxed == null) { Lazy<T>.LazyInternalExceptionHolder lazyInternalExceptionHolder = this.m_boxed as Lazy<T>.LazyInternalExceptionHolder; lazyInternalExceptionHolder.m_edi.Throw(); } } } finally { if (flag) { Monitor.Exit(obj); } } 注意Monitor.Enter和Monitor.Exit调用. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |