Wątek bezpieczny wzór C # Singleton

Mam kilka pytań dotyczących wzorca singletonu, jak tutaj udokumentowano:http://msdn.microsoft.com/en-us/library/ff650316.aspx

Poniższy kod jest fragmentem artykułu:

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

W szczególności, czy w powyższym przykładzie istnieje potrzeba dwukrotnego porównania instancji z wartością null przed i po blokadzie? Czy to konieczne? Dlaczego nie wykonać blokady najpierw i dokonać porównania?

Czy jest jakiś problem z uproszczeniem do poniższych?

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

         return instance;
      }
   }

Czy wykonanie blokady jest kosztowne?

questionAnswers(7)

yourAnswerToTheQuestion