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?