В нескольких текстах сказано, что при реализации блокировки с двойным проверкой в .NET в поле, в котором вы блокируетесь, должен применяться изменчивый модификатор. Но почему именно? Рассмотрим следующий пример:
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;
      }
   }
}
почему "lock (syncRoot)" не выполняет необходимую последовательность памяти? Не правда ли, что после слова "блокировка" как чтение, так и запись были бы неустойчивыми, и поэтому была бы обеспечена необходимая согласованность?