Segmento Seguro C # Singleton Padrão

Eu tenho algumas perguntas sobre o padrão singleton como documentado aqui:http://msdn.microsoft.com/pt-br/library/ff650316.aspx

O código a seguir é um extrato do artigo:

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

Especificamente, no exemplo acima, existe a necessidade de comparar a instância com null duas vezes, antes e depois do bloqueio? Isso é necessário? Por que não executar o bloqueio primeiro e fazer a comparação?

Existe um problema em simplificar para o seguinte?

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

         return instance;
      }
   }

O desempenho da trava é caro?

questionAnswers(7)

yourAnswerToTheQuestion