Что Опасности использовать Singleton в многопоточном приложении

В качестве альтернативы отличному ответу Мотти, вы также можете Set переменную, чтобы соответствовать вашему начальному описательному объекту, а затем расширить его по мере необходимости:

Set myPage = Browser("StackOverflow").Page("name:=StackOverflow", "html id:=PageID")

, после чего вы можете использовать

myPage.WebEdit("name:=asdfgh") 

во всем остальном коде, пока объект myPage остается в области видимости ...

9
задан Bob The Janitor 7 April 2009 в 17:00
поделиться

8 ответов

Это выглядит довольно хорошим мне.

Посмотрите Реализацию Шаблона "одиночка" в C# для большего количества информации.

Править: Должен, вероятно, поместить возврат в блокировке, все же.

13
ответ дан 4 December 2019 в 06:57
поделиться

Это более информационно, чем что-либо еще.

То, что Вы отправили, является перепроверяемым алгоритмом блокировки - и что Вы отправили, будет работать, насколько я знаю. (С Java 1.5 это работает там, также.) Однако это очень хрупко - если Вы понимаете какой-либо бит превратно его, Вы могли бы представить очень тонкие условия состязания.

Я обычно предпочитаю инициализировать одиночный элемент в статическом инициализаторе:

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

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

    private Singleton()
    {
        // Do stuff
    }
}

(Добавьте статического конструктора, если Вы хотите немного дополнительной лени.)

Тот шаблон, легче разобраться, и в большинстве случаев, это делает точно также.

Существует больше детали на моей одноэлементной странице реализации C# (также связано Michael).

Что касается опасностей - я сказал бы, что самая большая проблема состоит в том, что Вы теряете тестируемость. Вероятно, не слишком плохо для входа.

12
ответ дан 4 December 2019 в 06:57
поделиться

Singleton имеет потенциал, чтобы стать узким местом для доступа к ресурсу, воплощенному классом и вызвать последовательный доступ к ресурсу, который мог иначе использоваться параллельно.

В этом случае это не может быть плохой вещью, потому что Вы не хотите нескольких объектов, пишущих в Ваш файл в тот же момент, и несмотря на это я не думаю, что Ваша реализация будет иметь тот результат. Но это - что-то для знания.

3
ответ дан 4 December 2019 в 06:57
поделиться

Вы используете перепроверяемую блокировку, что считают антишаблоном. Википедия имеет шаблоны с и без ленивой инициализации для различных языков.

После создания одноэлементного экземпляра необходимо, конечно, удостовериться, что все методы ориентированы на многопотоковое исполнение.

1
ответ дан 4 December 2019 в 06:57
поделиться

Лучшее предложение состояло бы в том, чтобы установить регистратор на однопоточном шаге установки, таким образом, это, как гарантируют, будет там при необходимости в нем. В службе Windows OnStart является великолепным местом, чтобы сделать это.

Другой опцией, которую Вы имеете, является к используемому Система. Поточная обработка. Взаимно блокируемый. CompareExchange (T %, T, T): T метод для выключения. Это менее сбивает с толку, и это, как гарантируют, будет работать.

System.Threading.Interlocked.CompareExchange<Logging>(_instance, null, new Logging());
1
ответ дан 4 December 2019 в 06:57
поделиться

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

2
ответ дан 4 December 2019 в 06:57
поделиться

Существует некоторая дискуссия относительно необходимости сделать первую проверку для нулевого использования Thread.VolatileRead (), если вы используете шаблон блокировки с двойной проверкой и хотите, чтобы он работал на всех моделях памяти. Пример дебатов можно прочитать по адресу http://social.msdn.microsoft.com/forums/en-US/csharpgeneral/thread/b1932d46-877f-41f1-bb9d-b4992f29cedc/ . [1222 Тем не менее, я обычно использую решение Джона Скита сверху.

1
ответ дан 4 December 2019 в 06:57
поделиться

Я думаю, ориентированы ли Регистрирующиеся методы экземпляра на многопотоковое исполнение нет ничего для волнения о.

0
ответ дан 4 December 2019 в 06:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: