ho preso il codice di DCL dal libro di Joe Duffy 'Programmazione concorrente sulle finestre'Che tipo di operazione 'volatili' è necessario in ricontrollato blocco in .NET
class LazyInit<T> where T : class
{
private volatile T m_value;
private object m_sync = new object();
private Func<T> m_factory;
public LazyInit(Func<T> factory) { m_factory = factory; }
public T value
{
get
{
if (m_value == null)
{
lock (m_sync)
{
if (m_value == null)
{
m_value = m_factory();
}
}
}
return m_value;
}
}
}
si dice marcatura m_value volatili può prevenire scrive riordinamenti che porteranno ad altri thread ottenendo 'oggetto non nullo con campi non inizializzati'. Se il problema si verifica solo perché le possibili scritture possono essere riordinate, posso semplicemente usare "Volatile Write" invece di contrassegnare il file volatile, come di seguito? (Questo codice è un po 'imbarazzante per la dimostrazione, voglio solo per assicurarsi che, se siamo in grado di utilizzare solo scrittura volatili invece)
class LazyInit<T> where T : class
{
private object m_value;
private object m_sync = new object();
private Func<T> m_factory;
public LazyInit(Func<T> factory) { m_factory = factory; }
public T value
{
get
{
if (m_value == null)
{
lock (m_sync)
{
if (m_value == null)
{
Thread.VolatileWrite(ref m_value, m_factory());
}
}
}
return (T)m_value;
}
}
}
Una questione correlata è la versione Interlocked dal libro
class LazylnitRelaxedRef<T> where T : class
{
private volatile T m_value;
private Func<T> m_factory;
public LazylnitRelaxedRef(Func<T> factory) { m_factory = factory; }
public T Value
{
get
{
if (m_value == null)
Interlocked.CompareExchange(ref m_value, m_factory(), null);
return m_value;
}
}
}
Dal le specifiche ECMA-CLI "L'operazione interbloccata esegue operazioni di acquisizione/rilascio implicite", abbiamo ancora bisogno di volatilità in questo caso?
C'è una differenza importante tra il modello di memoria ECMA e il modello di memoria .net 2. – CodesInChaos
Perché è necessario eseguire il doppio controllo di blocco? Hai notato un problema di prestazioni con la tua applicazione con l'acquisizione di un lucchetto? –
@CodeInChaos, si prega di approfondire su quale sia la "differenza importante". – Amy