Простая реализация Singleton - PullRequest
8 голосов
/ 13 мая 2011

Разве это не более простой, но и безопасный (и, следовательно, лучший) способ реализации синглтона вместо двойной проверки блокировки мамбо-джамбо?Есть ли недостатки этого подхода?


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

Ответы [ 13 ]

1 голос
/ 13 мая 2011

Это не потокобезопасно.

Вам понадобится замок для удержания if() и Interlocked.CompareExchange() вместе, и тогда вам больше не понадобится CompareExchange.

0 голосов
/ 10 августа 2016

Не используйте блокировку.Используйте вашу языковую среду

В основном простая поточно-ориентированная реализация:

public class Singleton
{
    private static readonly Singleton _instance;

    private Singleton() { }

    static Singleton()
    {
        _instance = new Singleton();
    }

    public static Singleton Instance
    {
        get { return _instance; }
    }
}
0 голосов
/ 30 октября 2015

Я думаю, что самый простой способ после .NET 4.0 - использовать System.Lazy<T>:

public class Singleton
{
    private static readonly Lazy<Singleton> lazy = new Lazy<Singleton>(() => new Singleton());

    public static Singleton Instance { get { return lazy.Value; } }

    private Singleton() { }
}

У Джона Скита есть хорошая статья здесь , которая охватывает множество способов реализации синглтона ипроблемы каждого из них.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...