Безопасный поток C # Singleton Pattern

У меня есть несколько вопросов относительно шаблона синглтона, как описано здесь: http://msdn.microsoft.com/en-us/library/ff650316.aspx

Следующий код является выдержкой из статьи:

using System;

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;
      }
   }
}

В частности, в приведенном выше примере, есть ли необходимость дважды сравнивать экземпляр с нулем, до и после блокировки? Это необходимо? Почему бы сначала не выполнить блокировку и сделать сравнение?

Есть ли проблема в упрощении следующего?

   public static Singleton Instance
   {
      get 
      {
        lock (syncRoot) 
        {
           if (instance == null) 
              instance = new Singleton();
        }

         return instance;
      }
   }

Дорогое выполнение блокировки?

Ответы на вопрос(7)

Ваш ответ на вопрос