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?