Шаблоны проектирования. Реализация Singleton в C# и PHP

Комментарии

3 комментария(ев)
аватар: urumchic
urumchic
Дата: ПТ, 15/03/2013 - 22:41
Звание: Наблюдатель
Сообщений: 5

А на сколько данная реализация на C# подходит для многопоточного программирования ? Ведь есть доля вероятности что проверку if (instance == null) выполнят несколько потоков одновременно и если instance не инициализирована то каждый поток получит свой экземпляр класса а это уже не singleton.

аватар: Spider_NET
Spider_NET
Дата: СБ, 16/03/2013 - 09:58
Звание: Мастер
Сообщений: 2454

2urumchic

Совершенно верно, рассмотренный мной вариант нельзя назвать потокобезопасным. Если при решении задачи требуется учитывать потоки, то наилучшими вариантами будут:

- Рекомендация компании MS (]]>http://msdn.microsoft.com/ru-ru/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;
}
}
}

Такой вариант является потокобезопасным, но реализация требует чуть больше кода. К тому же, lock выступает дополнительным тормозом. Поэтому можно воспользоваться альтернативным вариантом:

public sealed class Singleton { private static readonly Singleton instance = new Singleton();

static Singleton() { }

private Singleton() { }

public static Singleton Instance
{
get { return instance; }
}
}

Тут нет lock, код значительно короче и заодно демонстрирует возможность readonly полей. Правда этот также не избавлен от ряда проблем.

аватар: DreamChild
DreamChild
Дата: Пнд, 18/03/2013 - 19:02
Звание: Наблюдатель
Сообщений: 6

Заодно и про Lazy-вариант можно было бы написать. А вообще у Скита по синглтонам в C# написано весьма подробно и обстоятельно. Почитать можно, например, ]]>Тут]]>