浏览MEF源代码我发现了这篇文章.有人可以解释为什么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);
}
Run Code Online (Sandbox Code Playgroud)
Thread.MemoryBarrier可防止抖动/编译器为代码优化而重新排序任何指令。
在Joe Albahari 所著的《Treading in C#》一书中,他说道:
在此示例中,可能会缓存 importEngine 或 _importEngine 值,并且必须立即通知所有线程有关更改,这一点非常重要。
在这种情况下,MemoryBarrier 在分配给 _importEngine 之前还提供 importEngine新鲜度保证