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?

questionAnswers(8)

yourAnswerToTheQuestion