浏览MEF源代码我找到了这一块。 有人可以解释为什么在锁内需要MemoryBarrier
?为什么在这里使用Thread.MemoryBarrier?
整个方法是:
public void SatisfyImportsOnce(ComposablePart part)
{
this.ThrowIfDisposed();
if (this._importEngine == null)
{
ImportEngine importEngine = new ImportEngine(this, this._compositionOptions);
lock(this._lock)
{
if (this._importEngine == null)
{
Thread.MemoryBarrier();
this._importEngine = importEngine;
importEngine = null;
}
}
if(importEngine != null)
{
importEngine.Dispose();
}
}
this._importEngine.SatisfyImportsOnce(part);
}
之前就*似乎*有时候,锁不够 –
这是不可能回答这个问题,不知道多了很多内容。 –
这是微软内存模式的处理器上的FUD,一些微软程序员可能永远不会从驯服安腾处理器中恢复过来。它确保另一个线程在使用_importEngine引用时可以观察完全构造的对象。在弱处理器上,在写入对象字段之前可以将引用写入内存,以便另一个线程可以看到未初始化的字段值。因为.NET 2.0并不是必需的,并且在这里绝对没有必要,因为锁已经意味着内存屏障。 –