浏览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);
}
答案 0 :(得分:1)
Thread.MemoryBarrier可防止抖动/编译器重新排序代码优化的任何指令。
在Treading in C#, by Joe Albahari书中,他说:
在此示例中,可能是缓存了importEngine或_importEngine值,并且必须立即通知所有线程有关更改的信息非常重要。
此情况下,MemoryBarrier在分配给_importEngine之前提供importEngine fresh garantee