Разве это не более простой, но и безопасный (и, следовательно, лучший) способ реализации синглтона вместо двойной проверки блокировки мамбо-джамбо?Есть ли недостатки этого подхода?
public class Singleton
{
private static Singleton _instance;
private Singleton() { Console.WriteLine("Instance created"); }
public static Singleton Instance
{
get
{
if (_instance == null)
{
Interlocked.CompareExchange(ref _instance, new Singleton(), null);
}
return _instance;
}
}
public void DoStuff() { }
}
РЕДАКТИРОВАТЬ: тест на безопасность потока не удалось, кто-нибудь может объяснить, почему?Как получается, что Interlocked.CompareExchange не является по-настоящему атомарным?
public class Program
{
static void Main(string[] args)
{
Parallel.For(0, 1000000, delegate(int i) { Singleton.Instance.DoStuff(); });
}
}
Result (4 cores, 4 logical processors)
Instance created
Instance created
Instance created
Instance created
Instance created