У меня есть несколько вопросов относительно шаблона singleton, как описано здесь: http://msdn.microsoft.com/en-us/library/ff650316.aspx
Следующий код представляет собой выдержку из статьи:
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;
}
}
}
В частности, в приведенном выше примере есть ли необходимость сравнивать экземпляр с нулевым значением дважды, до и после блокировки? Это необходимо? Почему бы сначала не выполнить блокировку и не провести сравнение?
Есть ли проблема в упрощении до следующего?
public static Singleton Instance
{
get
{
lock (syncRoot)
{
if (instance == null)
instance = new Singleton();
}
return instance;
}
}
Дорогое ли выполнение блокировки?