Navigando attraverso il codice sorgente MEF ho trovato questo pezzo. Qualcuno può spiegare perché è necessario MemoryBarrier
all'interno di un lucchetto?Perché Thread.MemoryBarrier è utilizzato qui?
L'intero metodo è:
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);
}
E * Sembra * che a volte, il blocco non è sufficiente –
E 'impossibile rispondere a questa domanda senza sapere molto di più contesto. –
È FUD su un processore con un modello di memoria debole, alcuni programmatori Microsoft probabilmente non si riprenderanno mai dal dover domare l'Itanium. Assicura che un altro thread possa osservare l'oggetto completamente costruito quando utilizza il riferimento _importEngine. Su un processore debole tale riferimento potrebbe essere scritto in memoria prima che i campi oggetto vengano scritti in modo che un altro thread possa vedere il valore del campo non inizializzato. Non necessario dal momento che .NET 2.0 e sicuramente non necessario qui poiché il blocco implica già una barriera di memoria. –