Tengo algunas preguntas sobre el patrón 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 nulo 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 a lo siguiente?
public static Singleton Instance
{
get
{
lock (syncRoot)
{
if (instance == null)
instance = new Singleton();
}
return instance;
}
}
¿Es caro realizar el bloqueo?