瀏覽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並不是必需的,並且在這裏絕對沒有必要,因爲鎖已經意味着內存屏障。 –