A necessidade de modificador volátil no bloqueio verificado em dobro no .NET
Múltiplos textos dizem que ao implementar o bloqueio duplo verificado no .NET, o campo que você está bloqueando deve ter um modificador volátil aplicado. Mas por que exatamente? Considerando o seguinte exemplo:
public sealed class Singleton
{
private static volatile Singleton instance;
private static object syncRoot = new Object();
private Singleton() {}
public static Singleton Instance
{
get
{
if (instance == null)
{
lock (syncRoot)
{
if (instance == null)
instance = new Singleton();
}
}
return instance;
}
}
}
Por que o "bloqueio (syncRoot)" não realiza a consistência de memória necessária? Não é verdade que, após a instrução "lock", tanto a leitura quanto a gravação seriam voláteis e, portanto, a consistência necessária seria cumprida?