Hilo seguro C # patrón Singleton

Tengo algunas preguntas con respecto al patrón de singleton como se documenta aquí:http://msdn.microsoft.com/en-us/library/ff650316.aspx

El siguiente código es un extracto del artículo:

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

Específicamente, en el ejemplo anterior, ¿es necesario comparar la instancia con nula dos veces, antes y después del bloqueo? ¿Es esto necesario? ¿Por qué no realizar el bloqueo primero y hacer la comparación?

¿Hay algún problema en simplificar lo siguiente?

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

         return instance;
      }
   }

¿Es caro realizar la cerradura?

Respuestas a la pregunta(7)

Su respuesta a la pregunta