Re: потокобезопасный Singleton
От: retalik www.airbandits.com/
Дата: 08.08.05 22:35
Оценка: 84 (7) +1
Здравствуйте, adontz, Вы писали:

A>Мне тут стало интересно, такой синглтон потокобезопасный? Двух экземплятор не создасться?


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

А вот кусочек из MSDN:

.NET Singleton Example

// .NET Singleton
sealed class Singleton 
{
    private Singleton() {}
    public static readonly Singleton Instance = new Singleton();
}

This version is dramatically simpler and more intuitive. Is it still a singleton? Let's look at what changed and then decide. We modified the class itself to be sealed (non-inheritable), the lazy initialization code is removed, the Instance() method is removed, and we modified the _instance variable extensively. The changes to the _instance variable include modifying the access level to public, marking the variable as read-only, and initializing the variable at declaration time. Here we can directly define the behavior we want and not be concerned with potential unwanted side effects of the implementation. So what about the advantages of using lazy initialization and the hazards of multiple threads? All of the correct behaviors are built into the .NET Framework. Let's take the first case, lazy initialization.

The main reasons for using lazy initialization initially were to get the behavior of having an instance created on only the first call to the Instance() method, and because there was some openness in the C++ spec that did not define the exact initialization order of static variables. To get desired singleton behavior in C++, a workaround that involved the use of lazy initialization was necessary. What we really care about is that we get the instance created either on or just before the first call to (in this case) the Instance property, and that we have a defined initialization order for static variables in a class. With the .NET Framework, this is exactly the behavior we get. The Framework, during the JIT process, will initialize the static property when (and only when) any method uses this static property. If the property is not used, then the instance is not created. More precisely, what happens during JIT is that the class gets constructed and loaded when any static member of the class is used by any caller. In this case the result is the same.

What about thread-safe initialization? The Framework addresses this too. The Framework internally guarantees thread safety on static type initialization. In other words, in the example above, there is only one instance that would ever be created of the Singleton class. Note also that the property field used to hold the instance of the class is called Instance. This choice better illustrates that this value is an instance of the class as part of the discussion in this article. In the Framework itself there are several classes that use this type of singleton, although the property name used is called Value instead. The concept is exactly the same.

Успехов,
Виталий.
Re: Потокобезопасный Singleton
От: Lloyd Россия  
Дата: 09.08.05 08:20
Оценка: 63 (6)
Здравствуйте, olegmad, Вы писали:

O>Плюс такой реализации, в том, что объект создается при первом вызове метода GetInstance(), т.е. нет вызовов — нет объекта.

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

Есть более элегантное решение:

public sealed class Singleton {
    private sealed class SingletonInstanceHolder {
        private SingletonInstanceHolder() {}
        public static readonly Singleton SingletonInstance = new Singleton();
    }

    private Singleton() {}
    
    public static Singleton Instance {
        get { return SingletonInstanceHolder.SingletonInstance; }
    }
}
... << RSDN@Home 1.1.4 stable rev. 510>>
Re[13]: потокобезопасный Singleton
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 10.08.05 09:12
Оценка: 26 (3)
Здравствуйте, <Аноним>, Вы писали:

AVK>>В принципе, если его вобще не использовать, может . А если серьезно, то примеры в студию.


А>Ну например тот же логгер-синглтон. Он никак не влияет на каплинг.


Очень даже влияет. Вот например:
// Singleton
public class BizEntity
{
    public void Foo()
    {
        // do some work
        System1.Logger.Instance.Log("Work done");
    }
}

// IServiceProvider
public class BizEntity
{
    public void Foo()
    {
        // do some work
        Context.GetService<ILogger>().Log("Work done");
    }
}


Пусть нам понадобилось запустить код BizEntity в другой системе с совершенно иной реализацией логгера. В первом варианте нам нужно будет перетаскивать исходники и править все вызовы логгера. Во-втором случае достаточно реализовать ILogger, при том даже перекомпилировать BizEntity не понадобится.
Едем дальше — вместо одного экземпляра нам понадобилось иметь в программе несколько, например для каждой сессии отдельно. И опять та же история. В первом варианте требуется перетряхивать логгер, менять семантику метода Log, либо вместо свойства Instance делать метод, соотвественно править код BizEntity и т.п. Во-втором варианте достаточно в нужном месте в контекст подсунуть нужный экземпляр. Опять же, при этом даже не требуется перекомпиляция BizEntity.
Третий вариант — нам нужно обеспечить подключение логгеров, написанных пользователем, путем указания имени класса в файле конфигурации. И опять та же история — перетряхать логгер, вводить механику выбора нужного экземпляра логгера.
Налицо значительно более высокая связность варианта с синглтоном, приводящая к тому что код с синглтонами хуже масштабируется.
... << RSDN@Home 1.2.0 alpha rev. 599>>
AVK Blog
Re[9]: Потокобезопасный Singleton
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 09.08.05 14:17
Оценка: 21 (2) +1
Здравствуйте, Tom, Вы писали:

Tom>в шарпе не нужно. Это самый лаконичный и потокобезопасный вариант


Он не совсем lazy. Например такой код вызовет подъем синглтона:
if (false)
    Singleton.Instance.Foo();

Хотя, по логике, и не должен.
... << RSDN@Home 1.2.0 alpha rev. 599>>
AVK Blog
Re[27]: Потокобезопасный Singleton
От: mogadanez Чехия  
Дата: 10.08.05 11:56
Оценка: :))
Здравствуйте, Merle, Вы писали:

M>Здравствуйте, mogadanez, Вы писали:


M>>....цитата из книги Банды Четырех

M>Да байта ради.. Они конечно дядьки хорошие, но совсем уж так уж тоже не стоит...
M>Суть-то как раз в том, что он действительно позволяет контролировать количество экземпляров, а не только ограничиваться одним. Один из банды, Влиссидес кажется, тракторвал этот паттерн именно так и даже приводил пример реального использования в этом качестве. И Википедия так же утверждает, что экземпляров может быть и несколько...

Да мегабайтом глянусь, согласен полностью, просто единственно что под рукой было откуда цитатку можно подрезать, они в спорах более убедительно звучат.
... << RSDN@Home 1.1.4 beta 6a rev. 436>>
Re[14]: Потокобезопасный Singleton
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 11.08.05 13:05
Оценка: 3 (1)
Здравствуйте, OlegAxenow, Вы писали:

OA>Можно подтверждающий пример или ссылку на документацию?


Можно.
using System;

class Logger
{
    public static readonly Logger Instance = new Logger();

    private Logger()
    {
        Console.WriteLine("Logger initialized");
    }

    public void Log(string message)
    {
        Console.WriteLine(message);
    }
}

class Logger2
{
    private class InstanceHolder
    {
        public static readonly Logger2 Instance = new Logger2();
    }

    public static Logger2 Instance
    {
        get { return InstanceHolder.Instance; }
    }

    private Logger2()
    {
        Console.WriteLine("Logger2 initialized");
    }

    public void Log(string message)
    {
        Console.WriteLine(message);
    }
}

class Program
{
    static void Main()
    {
        try
        {
            Console.WriteLine("Do some work");
        }
        catch (Exception ex)
        {
            Logger.Instance.Log(ex.Message);
            Logger2.Instance.Log(ex.Message);
        }
    }
}
... << RSDN@Home 1.2.0 alpha rev. 599>>
AVK Blog
Re[4]: Потокобезопасный Singleton
От: valmond Россия http://blogs.technet.com/valmond/
Дата: 09.08.05 08:06
Оценка: 1 (1)
Здравствуйте, Александр Сергеевич, Вы писали:

АС>Здравствуйте, valmond, Вы писали:

V>>См. внимательнее.
V>>Стандартная двойная проверка
АС>А зачем два if? А почему не один в lock?

После первого if-a мы проверяем, что достаточное условие для наложения лока и создания объекта выполняется.
Накладываем lock и проверяем, что после проверки достаточного условия второй поток еще не создал этот инстанс. Т.е. проверяем необходимое условие и делаем выводы.
Заметки — SharePoint & InfoPath
http://blogs.technet.com/valmond/
Re[17]: Потокобезопасный Singleton
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 10.08.05 10:05
Оценка: 1 (1)
Здравствуйте, Tom, Вы писали:

L>>Понятно. По четным дням значит разница есть, а по нечетным — нет?

Tom>Делать метод из мембера статическим при использовании патерна одиночка смысла нет.

Интересно, а ты метод Reset, который должен пересоздавать экземпляр синглтона тоже методом экземпляра сделаешь?
... << RSDN@Home 1.2.0 alpha rev. 599>>
AVK Blog
потокобезопасный Singleton
От: adontz Грузия http://adontz.wordpress.com/
Дата: 08.08.05 21:35
Оценка: :)
Мне тут стало интересно, такой синглтон потокобезопасный? Двух экземплятор не создасться?
public class MySingleton
{
    private static MySingleton _instance = new MySingleton();
    
    public static MySingleton Instance
    {
        get
        {
            return _instance;
        }
    }
}



12.08.05 11:06: Перенесено из '.NET'
A journey of a thousand miles must begin with a single step © Lau Tsu
Потокобезопасный Singleton
От: Аноним  
Дата: 09.08.05 07:25
Оценка: +1
В этом блоге увидел другой способ создания синглтона:

public class Singleton
{
 private static Singleton _instance;
 public static Singleton GetInstance()
 {
  if (_instance == null)
  {
   lock (typeof(Singleton))
   {
    if (_instance == null)
    {
     _instance = new Singleton();
    }
   }
  }
  return _instance;
 }
}


Плюс такой реализации, в том, что объект создается при первом вызове метода GetInstance(), т.е. нет вызовов — нет объекта.
На мой взгляд, использовать данную реализацию стоит только в каких то оссобенных и редких случаях.
________________________________
Best regards, Oleg Ufaev
Rostov .Net User Group
Конкурсная заявка


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Потокобезопасный Singleton
От: Аноним  
Дата: 09.08.05 07:37
Оценка: -1
Потокобезопасный Singleton:

public class Singleton
{
private static Singleton instance = null;
private static object root = new object();

private Singleton() { }

public Singleton Instance
{
get
{
lock(root)
if(instance == null)
instance = new Singleton();

return instance;
}
}
}


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Re: потокобезопасный Singleton
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 09.08.05 11:59
Оценка: +1
Для завершения картины упомяну, что синглтон нужно использовать очень осторожно, особенно в библиотеках, потому что он увеличивает связность (coupling) программы.
... << RSDN@Home 1.2.0 alpha rev. 599>>
AVK Blog
Re[2]: Потокобезопасный Singleton
От: Tom Россия http://www.RSDN.ru
Дата: 09.08.05 12:51
Оценка: +1
Здравствуйте, Lloyd, Вы писали:

L>Здравствуйте, olegmad, Вы писали:


O>>Плюс такой реализации, в том, что объект создается при первом вызове метода GetInstance(), т.е. нет вызовов — нет объекта.

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

L>Есть более элегантное решение:


L>
L>public sealed class Singleton {
L>    private sealed class SingletonInstanceHolder {
L>        private SingletonInstanceHolder() {}
L>        public static readonly Singleton SingletonInstance = new Singleton();
L>    }

L>    private Singleton() {}
    
L>    public static Singleton Instance {
L>        get { return SingletonInstanceHolder.SingletonInstance; }
L>    }
L>}
L>


А в чём элегантность? Чем прост public static readonly не подходит?
... << RSDN@Home 1.1.4 beta 4 rev. 303>>
Народная мудрось
всем все никому ничего(с).
Re[11]: Потокобезопасный Singleton
От: Lloyd Россия  
Дата: 10.08.05 08:07
Оценка: :)
Здравствуйте, Andrbig, Вы писали:

A>И что там? Что вызов статического метода вызовет создание статических переменных? Естественно. Для обычных методов создаются обычные переменные, для статических — статические. Если какому-то стат. методу не нужны стат. переменные данного класса, то какого хрена этот метод делает в данном классе? Это банальная ошибка дизайна. Или лень.


Ты гений.

A>Впрочем, и для таких любителей неполовых извращений есть простой выход:

A>
A>    public sealed class Singleton 
A>    {
A>        private sealed class Core
A>        {
A>            private Core()
A>            {
A>            }
A>            public static readonly Singleton Instance = new Singleton();
A>        }
A>        private Singleton()
A>        {
A>        }
A>        public static Singleton Instance
A>        {
A>            get { return Core.Instance; }
A>        }
A>        public void Foo() // Этому методу нужен Instance
A>        {
A>        }
A>        public static void ok()  // Этому методу не нужен Instance
A>        {
A>        }
A>    }
A>


Маладца. Переименовал внутренний класс и дописал пару методов. Ты по ветке-то поднимись и сравни то что ты написал и написал я.

A>Впрочем, если кто-то хочет извратиться еще больше, двери С++ открыты вая вас!


С++ — то к чему здесь приплел?

A>Так что я не поменял своего мнения про дабл-локинг: эта муть зеленая — исключительно для С++. Или кто-то хочет сказать, что сампальный велосипед будет работать лучше чем встроенные в .NET средства?


Не спеши с выводами. Раз уж ты взялся рассуждать о дизайне, скажи пожалуйста, какую сущность выражает твой внутренний класс Core?

A>Если что-то кажется тебе лучшим, это не обязательно значит, что это лучшее. Возможно ты просто не знаешь о более лучших вариантах.


Вы все еще уверены что есть лучшие варианты. Э-э-х, молодость.
... << RSDN@Home 1.1.4 stable rev. 510>>
Re[19]: Потокобезопасный Singleton
От: Lloyd Россия  
Дата: 10.08.05 09:44
Оценка: +1
Здравствуйте, Andrbig, Вы писали:

L>>Для чего тебе это? Ты хочеь обсудить должны ли объекты использоваться как объекты или их можно использовать в том числе и для различных трюков? Если да, то этот вопрос не для этого форума.


A>Не надо за меня додумывать. Я хотел обсудить, как данная сущность отобразится на классы. Если нет желания, хорошо, не станем.


Хорошо, не будем. К тому же это явно не является темой этого форума.
... << RSDN@Home 1.1.4 stable rev. 510>>
Re[23]: Потокобезопасный Singleton
От: mogadanez Чехия  
Дата: 10.08.05 11:15
Оценка: +1
Здравствуйте, Andrbig, Вы писали:

A>Если синглтон слегка модифицированный, то и решение тоюе будет слегка модифицированным.

A>А до сего момента речь вроде шла про чистые синглтоны.

Паттерн это не компонент. У него нет единого кода на все случаи

цитатат из книги по паттернам:

Паттерн Singleton
Назначение:
Гарантирует, что у класса есть только один экземпляр, и предоставляет к нему глобальную точку доступа


— тут ничего не сказано про то что синглтон нельзя пересоздать, при условии что у нас также будет один экземпляр после этого

оттуда же:


В общем случае паттерн состоит из четрех основных элементов:

1. Имя......
2. Задача....
3. Решение. Описание элементов дизайна, отношений между ними, функций каждого элемента. Конретный дизайн или реализация не имеются в виду, поскольку паттерн — это шаблон, применимый в самых разных ситуациях. Просто дается абстрактное описание задачи проектирования и того, как она может быть решена с помощью некоего весьма обобщенного сочетания элементов( в нашем случае классов и объектов )
4. Результаты.....

... << RSDN@Home 1.1.4 beta 6a rev. 436>>
Re[24]: Потокобезопасный Singleton
От: Merle Австрия http://rsdn.ru
Дата: 10.08.05 11:25
Оценка: +1
Здравствуйте, mogadanez, Вы писали:

M>Гарантирует, что у класса есть только один экземпляр, и предоставляет к нему глобальную точку доступа

Кстати, в общем случае, даже не один экземпляр.
Этот паттерн просто позволяет контролировать число экземпляров объекта, а то что как правило требуется только один экземпляр — это частный случай.
... << RSDN@Home 1.1.4 beta 7 rev. 0>>
Мы уже победили, просто это еще не так заметно...
Re[17]: потокобезопасный Singleton
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 10.08.05 14:09
Оценка: +1
Здравствуйте, savaDAN, Вы писали:

AVK>>Зачем?

DAN>

DAN>Пусть нам понадобилось запустить код BizEntity в другой системе с совершенно иной реализацией логгера. В первом варианте нам нужно будет перетаскивать исходники и править все вызовы логгера

DAN>.. А в вашем варианте приложению в которое вставляют BizEntity придется реализовывать ILogger интерфейс.

Или воспользоваться одной из готовых реализаций. Но даже если придется, то в системном коде 1 раз. Трогать прикладной код при этом не нужно. Надеюсь доказывать, что неизменность прикладного кода намного важнее не надо?

DAN>Т.е. от того что синглтон стал фабрикой _связность_ (как количество знаний данного класса о других классах) не изменилась.. она даже увеличилась: мало того что надо знать об ILogger, так еще и о Context-ах.


Изменилась. Потому что во втором варианте прикладной код знает только о публичном интерфейсе и ничего о реализации. А вот в первом он знает и о реализации.

DAN>С другой стороны, кто мешает в разных системах делать в таком случае свои реализации Logger.Instance которые будут возвращать разные реализации (в разных системах) ILogger? Синглтоном он от этого имхо быть не перестанет.


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

AVK>>Logger.Instance это реализация. Отделить интерфейс нам не удастся. Это значит, что максимум, что мы сможем обеспечить, это перенос исходников и точное совпадение полного имени логгера во всех приложениях.

DAN>Упихивание разных логгеров в ILogger это по большому счету не одно и тоже?

Нет.

AVK>>Зачем? Процесс создания экземпляра во втором варианте от прикладного кода скрыт. Его, при смене политики управления экземплярами, даже перекомпилировать не придется. А вот с синглтоном такое так просто уже не провернешь.

DAN>Тогда видимо я вас не так понял.
DAN>

DAN>вместо одного экземпляра нам понадобилось иметь в программе несколько, например для каждой сессии отдельно.


DAN>
DAN>        // do some work
DAN>        Context.GetService<ILogger>().Log("Work done");
DAN>

DAN>Как без изменения клиентского кода можно будет сделать чтобы эта строка в одном месте писала в файл, а в другом эта же самая строка выводила.. ну хотя бы в другой файл?

Очень просто. AddService вызывает системный код где то за кадром. И что и когда он туда добавит прикладной код не знает. Он может добавить один раз при старте, может один раз при первом запросе, может где нибудь вниз по стеку перекрыть реализацию другой.

DAN>Вот поэтому я и говорил — клиентский код придется менять.


Зачем? Вот тот же пример, только более подробный:
// System code
public class Server
{
    public void DoSomeWork()
    {
        ServerContext ctx = new ServerContext();
        ctx.AddService<ILogger>(new FileLogger(...));
        GetEntity(ctx).Foo();
    }
}

// Client code
public class BizEntity
{
    public void Foo()
    {
        // do some work
        Context.GetService<ILogger>().Log("Work done");
    }
}


Что в прикладном коде придется менять при изменении политики управления экземплярами логгера?

DAN>>>Но это не значит что всегда вместо синглтонов стоит делать фабрики. в том числе и для логгеров.

AVK>>А я этого и не говорил.
DAN>Прошу прощения!
DAN>Беру свои слова обратно.
DAN>Я собственно тоже только хотел сказать что использование фабрики вместо синглтона связность не уменьшает

Таки уменьшает.
... << RSDN@Home 1.2.0 alpha rev. 599>>
AVK Blog
Re[26]: Потокобезопасный Singleton
От: Merle Австрия http://rsdn.ru
Дата: 14.08.05 18:33
Оценка: +1
Здравствуйте, VladD2, Вы писали:

VD>Вот это уже будет точно не синглтон.

Именно сингтон:
Re[30]: Потокобезопасный Singleton
Автор: Merle
Дата: 12.08.05


VD> Все же сам смысл этого паттерна нарушается.

И в чем же смысл? Смысл именно в том, что ты можешь контролировать число объектов. А один он тебе нужен или несколько — дело десятое.
... << RSDN@Home 1.1.4 beta 6a rev. 0>>
Мы уже победили, просто это еще не так заметно...
Re[29]: Потокобезопасный Singleton
От: VladD2 Российская Империя www.nemerle.org
Дата: 15.08.05 11:03
Оценка: -1
Здравствуйте, Павел Кузнецов, Вы писали:

Это уже получается несколько другой паттерн. Я конечно понимаю, что изменить можно все. И что иногда это бывает необходимо. Но, если так вольно обращаться с трактованием, то как понимаь друг-друга произнося "синглтон"?
... << RSDN@Home 1.2.0 alpha rev. 591>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[30]: Потокобезопасный Singleton
От: Merle Австрия http://rsdn.ru
Дата: 15.08.05 12:11
Оценка: +1
Здравствуйте, VladD2, Вы писали:

VD>И что там?

VD>Под рукой нет книги, а Интернет медленный. Прведи, плиз, цитату в котрой об этом говорилось бы.
Я уже приводил, как и Паша, цитаты из GоF и из книги Влиссидеса по применению некоторых паттернов описанных в GoF.
Re[30]: Потокобезопасный Singleton
Автор: Merle
Дата: 12.08.05

Re[28]: Потокобезопасный Singleton
Автор: Павел Кузнецов
Дата: 14.08.05

Да и википедия говорит примерно то же самое:

In computer science, the singleton design pattern is designed to restrict instantiation of a class to one (or a few) objects.

... << RSDN@Home 1.1.4 beta 7 rev. 0>>
Мы уже победили, просто это еще не так заметно...
потокобезопасный Singleton
От: Аноним  
Дата: 08.08.05 22:02
Оценка:
Нет, не создастся.

Данная информация предоставляется на условиях «КАК ЕСТЬ», без предоставления каких-либо гарантий и прав. Используя данную информацию, вы соглашаетесь с тем, что (i) Майкрософт не несет ответственности за использование вами данной информации и (ii) вы принимаете на себя весь риск, связанный с использованием данной информации.


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Потокобезопасный Singleton
От: Аноним  
Дата: 09.08.05 07:24
Оценка:
В этом блоге увидел другой способ создания синглтона:

public class Singleton
{
 private static Singleton _instance;
 public static Singleton GetInstance()
 {
  if (_instance == null)
  {
   lock (typeof(Singleton))
   {
    if (_instance == null)
    {
     _instance = new Singleton();
    }
   }
  }
  return _instance;
 }
}


Плюс такой реализации, в том, что объект создается при первом вызове метода GetInstance(), т.е. нет вызовов — нет объекта.
На мой взгляд, использовать данную реализацию стоит только в каких то оссобенных и редких случаях.
________________________________
Best regards, Oleg Ufaev
Rostov .Net User Group
Конкурсная заявка


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Re: Потокобезопасный Singleton
От: Аноним  
Дата: 09.08.05 07:31
Оценка:
Здравствуйте, Аноним, Вы писали:

А>В этом блоге увидел другой способ создания синглтона:


А>
public class Singleton
А>{
А> private static Singleton _instance;
А> public static Singleton GetInstance()
А> {
А>  if (_instance == null)
А>  {
А>   lock (typeof(Singleton))
А>   {
А>    if (_instance == null)
А>    {
А>     _instance = new Singleton();
А>    }
А>   }
А>  }
А>  return _instance;
А> }
А>}
А>


и для чего тут нужен lock если он не обрамляет if ?
Re[2]: Потокобезопасный Singleton
От: valmond Россия http://blogs.technet.com/valmond/
Дата: 09.08.05 07:45
Оценка:
А>>
public class Singleton
А>>{
А>> public static Singleton GetInstance()
А>> {
А>>  if (_instance == null)
А>>  {
А>>   lock (typeof(Singleton))
А>>   {
А>>    if (_instance == null)
А>>    {
А>>     _instance = new Singleton();
А>>    }
А>>   }
А>>  }
А>>  return _instance;
А>> }
А>>}
А>>


А>и для чего тут нужен lock если он не обрамляет if ?


См. внимательнее.
Стандартная двойная проверка
Заметки — SharePoint & InfoPath
http://blogs.technet.com/valmond/
Re: Потокобезопасный Singleton
От: Аноним  
Дата: 09.08.05 07:56
Оценка:
>и для чего тут нужен lock если он не обрамляет if ?

Такая конструкция используется для того, чтобы устранить синхронизацию при каждом вызове этого метода. Синхронизация будет производиться до тех пор, пока _instance будет null.

Второе условие проверки на null, нужно для избежания создания нескольких экземпляров класса Singleton (так как несколько потоков могут пройти первое условие проверки на null). Пример Rafiki не учитывает эту ситуацию.

Я думаю, что единственное чего здесь не хватает, для полноценной потокобезопасности — это объявление поля _instance как volatile, для обеспечения атомарности сравнения (_instance == null).
________________________________
Best regards, Oleg Ufaev
Rostov .Net User Group
Конкурсная заявка


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Re[3]: Потокобезопасный Singleton
От: Александр Сергеевич Россия  
Дата: 09.08.05 07:56
Оценка:
Здравствуйте, valmond, Вы писали:
V>См. внимательнее.
V>Стандартная двойная проверка
А зачем два if? А почему не один в lock?
/* silent */
Re[2]: Потокобезопасный Singleton
От: Tom Россия http://www.RSDN.ru
Дата: 09.08.05 07:58
Оценка:
А>и для чего тут нужен lock если он не обрамляет if ?
Это называется double check lock pattern
... << RSDN@Home 1.1.4 beta 4 rev. 303>>
Народная мудрось
всем все никому ничего(с).
Re: потокобезопасный Singleton
От: hugo Австрия  
Дата: 09.08.05 08:18
Оценка:
Здравствуйте, adontz, Вы писали:

A>Мне тут стало интересно, такой синглтон потокобезопасный? Двух экземплятор не создасться?


Можно еще так

   public class Singleton<T>
   {
      static private T _instance;
      static private object _lock = new object();

      protected Singleton()
      {
      }

      public static T Instance
      {
         get
         {
            if(_instance == null)
            {
               lock(_lock)
               {
                  if(_instance == null)
                  {
                     ConstructorInfo ci = type.GetConstructor(BindingFlags.Instance | BindingFlags.NonPublic,
                        null,
                        new Type[] { },
                        null);
                     _instance = (T)ci.Invoke(null);
                  }
               }
            }
            return _instance;
         }
      }
   }
Re: потокобезопасный Singleton
От: vitaly_spb Россия  
Дата: 09.08.05 08:41
Оценка:
Это не самый потокобезопасный метод. Возможные имплементации есть здесь:

http://dofactory.com/Patterns/PatternSingleton.aspx

А также можешь поискать про Double lock

http://www.google.ru/search?hl=ru&amp;q=double+lock+singleton&amp;lr=
...Ei incumbit probatio, qui dicit, non qui negat...
Re[2]: потокобезопасный Singleton
От: Lloyd Россия  
Дата: 09.08.05 09:51
Оценка:
Здравствуйте, hugo, Вы писали:

public class Singleton<T> where T: new()

И вместо Reflection-а будет просто new T();
... << RSDN@Home 1.1.4 stable rev. 510>>
Re[3]: потокобезопасный Singleton
От: Аноним  
Дата: 09.08.05 10:35
Оценка:
Здравствуйте, Lloyd, Вы писали:

L>И вместо Reflection-а будет просто new T();


+ "дырка" в паттерне
Re[4]: потокобезопасный Singleton
От: hugo Австрия  
Дата: 09.08.05 10:40
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, Lloyd, Вы писали:


L>>И вместо Reflection-а будет просто new T();


А>+ "дырка" в паттерне

Да, вот, собственно говоря, поэтому и остановился на рефлекшине
Если скорость большая не нужна...
Кроме того у меня там еще есть "точка расширения" — можно подсунуть другой тип с клиентской реализацией —
которую я убрал из примера.
Re[5]: потокобезопасный Singleton
От: Аноним  
Дата: 09.08.05 10:43
Оценка:
Здравствуйте, hugo, Вы писали:

H>Здравствуйте, Аноним, Вы писали:


А>>Здравствуйте, Lloyd, Вы писали:


L>>>И вместо Reflection-а будет просто new T();


А>>+ "дырка" в паттерне

H>Да, вот, собственно говоря, поэтому и остановился на рефлекшине
H>Если скорость большая не нужна...

Думается, разница в скорость здесь не критична

H>Кроме того у меня там еще есть "точка расширения" — можно подсунуть другой тип с клиентской реализацией —

H>которую я убрал из примера.

А вот паттерны скрещивать не стоит (фабрика и синглетон).
Re[6]: потокобезопасный Singleton
От: hugo Австрия  
Дата: 09.08.05 10:46
Оценка:
Здравствуйте, Аноним, Вы писали:

H>>Кроме того у меня там еще есть "точка расширения" — можно подсунуть другой тип с клиентской реализацией —

H>>которую я убрал из примера.

А>А вот паттерны скрещивать не стоит (фабрика и синглетон).


А если надо? Тут либо фабрика с сингелтоном, либо наоборот
Что еще можете посоветовать?
Re[7]: потокобезопасный Singleton
От: Аноним  
Дата: 09.08.05 10:54
Оценка:
Здравствуйте, hugo, Вы писали:

H>Что еще можете посоветовать?


Сформулируй задачу по-детальнее.
Re[8]: потокобезопасный Singleton
От: hugo Австрия  
Дата: 09.08.05 11:10
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Сформулируй задачу по-детальнее.


Есть класс, объект которого должен быть в одном экземпляре. При загрузке приложения вместо объекта этого класса может быть создан объект, синглетон, другого класса, производного от первого.
Какие есть варианты?
Re[9]: потокобезопасный Singleton
От: Аноним  
Дата: 09.08.05 12:10
Оценка:
Здравствуйте, hugo, Вы писали:

H>Здравствуйте, Аноним, Вы писали:


А>>Сформулируй задачу по-детальнее.


H>Есть класс, объект которого должен быть в одном экземпляре. При загрузке приложения вместо объекта этого класса может быть создан объект, синглетон, другого класса, производного от первого.

H>Какие есть варианты?

Думаю, такие же, как у тебя Но если констурктор будет с параметрами, придется вводить фабрики и использовать из из синглетона.
Re[6]: потокобезопасный Singleton
От: vitaly_spb Россия  
Дата: 09.08.05 12:29
Оценка:
А>А вот паттерны скрещивать не стоит (фабрика и синглетон).

Чего за бред, почему? Это вполне нормальная практика — тебе часто сам экземпляр фактори не нужен.
...Ei incumbit probatio, qui dicit, non qui negat...
Re[2]: потокобезопасный Singleton
От: adontz Грузия http://adontz.wordpress.com/
Дата: 09.08.05 12:43
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>Для завершения картины упомяну, что синглтон нужно использовать очень осторожно, особенно в библиотеках, потому что он увеличивает связность (coupling) программы.


Он мне для логгирования нужен был, так что думаю я его правильно использую
A journey of a thousand miles must begin with a single step © Lau Tsu
Re[10]: потокобезопасный Singleton
От: hugo Австрия  
Дата: 09.08.05 12:46
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Думаю, такие же, как у тебя Но если констурктор будет с параметрами, придется вводить фабрики и использовать из из синглетона.


Понял
Re[3]: Потокобезопасный Singleton
От: Lloyd Россия  
Дата: 09.08.05 12:54
Оценка:
Здравствуйте, Tom, Вы писали:

Tom>А в чём элегантность? Чем прост public static readonly не подходит?


Потокобезопасный Singleton
Автор: olegmad
Дата: 09.08.05
... << RSDN@Home 1.1.4 stable rev. 510>>
Re[4]: Потокобезопасный Singleton
От: Tom Россия http://www.RSDN.ru
Дата: 09.08.05 13:02
Оценка:
Tom>>А в чём элегантность? Чем прост public static readonly не подходит?

L>Потокобезопасный Singleton
Автор: olegmad
Дата: 09.08.05


А в чём элегантность? Чем прост public static readonly не подходит?
... << RSDN@Home 1.1.4 beta 4 rev. 303>>
Народная мудрось
всем все никому ничего(с).
Re[5]: Потокобезопасный Singleton
От: Andrbig  
Дата: 09.08.05 13:10
Оценка:
Здравствуйте, Tom, Вы писали:

Tom>>>А в чём элегантность? Чем прост public static readonly не подходит?


L>>Потокобезопасный Singleton
Автор: olegmad
Дата: 09.08.05


Tom>А в чём элегантность? Чем прост public static readonly не подходит?


Присоединяюсь. Зачем эта мышиная возня с двумя локами, если .NET обеспечивает
Автор: retalik
Дата: 09.08.05
синхронизацию?
Re[6]: Потокобезопасный Singleton
От: Tom Россия http://www.RSDN.ru
Дата: 09.08.05 13:23
Оценка:
Здравствуйте, Andrbig, Вы писали:

A>Здравствуйте, Tom, Вы писали:


Tom>>>>А в чём элегантность? Чем прост public static readonly не подходит?


L>>>Потокобезопасный Singleton
Автор: olegmad
Дата: 09.08.05


Tom>>А в чём элегантность? Чем прост public static readonly не подходит?


A>Присоединяюсь. Зачем эта мышиная возня с двумя локами, если .NET обеспечивает
Автор: retalik
Дата: 09.08.05
синхронизацию?


Так же возня с инер классом так же непонятна.
... << RSDN@Home 1.1.4 beta 4 rev. 303>>
Народная мудрось
всем все никому ничего(с).
Re[7]: Потокобезопасный Singleton
От: vitaly_spb Россия  
Дата: 09.08.05 13:27
Оценка:
Tom>Так же возня с инер классом так же непонятна.

Ответ на самом микрософте

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnbda/html/singletondespatt.asp
...Ei incumbit probatio, qui dicit, non qui negat...
Re[8]: Потокобезопасный Singleton
От: Tom Россия http://www.RSDN.ru
Дата: 09.08.05 13:28
Оценка:
_>http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnbda/html/singletondespatt.asp
Ты хоть читал мой пост?

Я говорю о том, что ничего более умного чем:

// .NET Singleton
sealed class Singleton 
{
    private Singleton() {}
    public static readonly Singleton Instance = new Singleton();
}


в шарпе не нужно. Это самый лаконичный и потокобезопасный вариант
... << RSDN@Home 1.1.4 beta 4 rev. 303>>
Народная мудрось
всем все никому ничего(с).
Re[3]: потокобезопасный Singleton
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 09.08.05 13:34
Оценка:
Здравствуйте, adontz, Вы писали:

A>Он мне для логгирования нужен был, так что думаю я его правильно использую


До тех пор, пока тебе не понадобится два независимых логгера с одинаковым интерфейсом. Или когда ты попытаешься компоненты, выводящие что то в лог, перенести в другую программу.
... << RSDN@Home 1.2.0 alpha rev. 599>>
AVK Blog
Re[9]: Потокобезопасный Singleton
От: Lloyd Россия  
Дата: 09.08.05 13:51
Оценка:
Здравствуйте, Tom, Вы писали:

Tom>в шарпе не нужно. Это самый лаконичный и потокобезопасный вариант


А теперь представь, что табе захотелось в класс Singleton добавить еще один какой-нить статический член. Тогда обращение Singleton.[какой-нить статический член] вызовет создание экземпляра Singleton, хотя на самом деле он вовсе не был нужен. Дабл-локинг или приватный внутренний класс решает эту проблему.
... << RSDN@Home 1.1.4 stable rev. 510>>
Re[4]: потокобезопасный Singleton
От: adontz Грузия http://adontz.wordpress.com/
Дата: 09.08.05 13:54
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>До тех пор, пока тебе не понадобится два независимых логгера с одинаковым интерфейсом.


Зачем такое может понадобится?

AVK>Или когда ты попытаешься компоненты, выводящие что то в лог, перенести в другую программу.


Логгер оформлен как отдельный проект.
A journey of a thousand miles must begin with a single step © Lau Tsu
Re[8]: Потокобезопасный Singleton
От: Andrbig  
Дата: 09.08.05 13:58
Оценка:
Здравствуйте, vitaly_spb, Вы писали:

Tom>>Так же возня с инер классом так же непонятна.


_>Ответ на самом микрософте


_>http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnbda/html/singletondespatt.asp


Именно оттуда:

Про lazy initialization:

The main reasons for using lazy initialization initially were to get the behavior of having an instance created on only the first call to the Instance() method...
With the .NET Framework, this is exactly the behavior we get.


Про потокобезопасность:

What about thread-safe initialization? The Framework addresses this too. The Framework internally guarantees thread safety on static type initialization.



ВЫВОД: Муть зеленая про двойной лок — исключительно для С++.

Для тех, кто не верит, цитата оттуда же:

To get desired singleton behavior in C++, a workaround that involved the use of lazy initialization was necessary.

Re[9]: Потокобезопасный Singleton
От: Lloyd Россия  
Дата: 09.08.05 14:03
Оценка:
Здравствуйте, Andrbig, Вы писали:

A>ВЫВОД: Муть зеленая про двойной лок — исключительно для С++.


Re[9]: Потокобезопасный Singleton
Автор: Lloyd
Дата: 09.08.05


A>Для тех, кто не верит, цитата оттуда же:

A>

A>To get desired singleton behavior in C++, a workaround that involved the use of lazy initialization was necessary.


Если что-то кажется тебе ошибочным, это не обязательно значит, что это ошибочно. Возможно ты просто не понял для чего это сделано.
... << RSDN@Home 1.1.4 stable rev. 510>>
Re[5]: потокобезопасный Singleton
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 09.08.05 14:17
Оценка:
Здравствуйте, adontz, Вы писали:

AVK>>До тех пор, пока тебе не понадобится два независимых логгера с одинаковым интерфейсом.


A>Зачем такое может понадобится?


Всяко бывает. Например тебе понадобилось в одном домене вести для разных компонентов разные логи.

AVK>>Или когда ты попытаешься компоненты, выводящие что то в лог, перенести в другую программу.


A>Логгер оформлен как отдельный проект.


Ну и что? В другом приложении этот логгер может оказаться неприменим. А интерфейс для синглтона ты уже не введешь, у тебя весь код, его использующий, намертво завязан на реализацию.
... << RSDN@Home 1.2.0 alpha rev. 599>>
AVK Blog
Re[10]: Потокобезопасный Singleton
От: Аноним  
Дата: 09.08.05 14:20
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>Он не совсем lazy. Например такой код вызовет подъем синглтона:

AVK>
AVK>if (false)
AVK>    Singleton.Instance.Foo();
AVK>

AVK>Хотя, по логике, и не должен.

И много в реальной жизни такого кода встречается?
Re[11]: Потокобезопасный Singleton
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 09.08.05 14:39
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>И много в реальной жизни такого кода встречается?


Не в таком примитивном виде, но бывает. Например для Роминого логгера:
try
{
    // Do some work
}
catch (Exception ex)
{
    Logger.Instance.Log(ex.Message);
}

Вполне реальный код.
... << RSDN@Home 1.2.0 alpha rev. 599>>
AVK Blog
Re[6]: потокобезопасный Singleton
От: adontz Грузия http://adontz.wordpress.com/
Дата: 09.08.05 14:42
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>Всяко бывает. Например тебе понадобилось в одном домене вести для разных компонентов разные логи.


Сейчас можно логи разнести по нескольким десяткам категориям. Типа эти пишите в это файла, те в тот, другие отправляйте в DebugOutput и т.д. Так что никакой проблемы вести хоть 10 логов одновременно нету.

AVK>>>Или когда ты попытаешься компоненты, выводящие что то в лог, перенести в другую программу.

A>>Логгер оформлен как отдельный проект.

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


Чего-то мне не кажется что мой логгер окажется неприменим Я его написал когда меня достали глюки и не гибкость log4net. Со временем, когда прилижу, выложу в исходники.
A journey of a thousand miles must begin with a single step © Lau Tsu
Re[12]: Потокобезопасный Singleton
От: adontz Грузия http://adontz.wordpress.com/
Дата: 09.08.05 14:44
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>Не в таком примитивном виде, но бывает. Например для Роминого логгера:

AVK>
AVK>try
AVK>{
AVK>    // Do some work
AVK>}
AVK>catch (Exception ex)
AVK>{
AVK>    Logger.Instance.Log(ex.Message);
AVK>}
AVK>

AVK>Вполне реальный код.

А что, логгер создасться даже если исключение не было брошено? Ва! Как интересно! Хотя в контексте задачи меня это мало волнует.
A journey of a thousand miles must begin with a single step © Lau Tsu
Re[2]: потокобезопасный Singleton
От: Igor Trofimov  
Дата: 09.08.05 14:57
Оценка:
AVK>Для завершения картины упомяну, что синглтон нужно использовать очень осторожно, особенно в библиотеках, потому что он увеличивает связность (coupling) программы.

А какие есть хорошие альтернативы? Допустим, в той же задаче логирования.
Re[13]: Потокобезопасный Singleton
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 09.08.05 15:11
Оценка:
Здравствуйте, adontz, Вы писали:

A>А что, логгер создасться даже если исключение не было брошено?


В примитивной реализации со статическим инициализатором да, поскольку статический конструктор вызывается в момент работы JIT, а ему пофигу, выполнится ли кусок кода или нет, он компилирует весь метод.
... << RSDN@Home 1.2.0 alpha rev. 599>>
AVK Blog
Re[7]: потокобезопасный Singleton
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 09.08.05 15:11
Оценка:
Здравствуйте, adontz, Вы писали:

A>Сейчас можно логи разнести по нескольким десяткам категориям. Типа эти пишите в это файла, те в тот, другие отправляйте в DebugOutput и т.д. Так что никакой проблемы вести хоть 10 логов одновременно нету.


А если бы такой возможности не было? Пришлось бы править весь код. Потому и говорю, что синглтон сильно увеличивает связность кода. Поэтому, если в конечных приложениях, когда ты в какой то степени уверен в использовании, это еще прокатывает, то применение этого паттерна (как, впрочем, и статических методов, меняющих состояние) в библиотеках, потенциальный источник проблем.
... << RSDN@Home 1.2.0 alpha rev. 599>>
AVK Blog
Re[3]: потокобезопасный Singleton
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 09.08.05 15:11
Оценка:
Здравствуйте, Igor Trofimov, Вы писали:

iT>А какие есть хорошие альтернативы? Допустим, в той же задаче логирования.


Альтернатив много. Например IServiceProvider/IServiceContainer. Для протаптывания экземпляров провайдеров обычно вводят понятие контекста (например ITypeDescriptorContext).
... << RSDN@Home 1.2.0 alpha rev. 599>>
AVK Blog
Re[8]: потокобезопасный Singleton
От: adontz Грузия http://adontz.wordpress.com/
Дата: 09.08.05 15:19
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>А если бы такой возможности не было?


Тогда это был бы наколеночный лисапед
A journey of a thousand miles must begin with a single step © Lau Tsu
Re[8]: потокобезопасный Singleton
От: vitaly_spb Россия  
Дата: 09.08.05 15:28
Оценка:
AVK>А если бы такой возможности не было? Пришлось бы править весь код. Потому и говорю, что синглтон сильно увеличивает связность кода. Поэтому, если в конечных приложениях, когда ты в какой то степени уверен в использовании, это еще прокатывает, то применение этого паттерна (как, впрочем, и статических методов, меняющих состояние) в библиотеках, потенциальный источник проблем.

Синглтон не сильно увеличивает связность кода если действовать с умом. Если же пихать его куда ни попадя — то тогда действительно возникнут проблемы. Но во втором случае проблема не в синглтоне
...Ei incumbit probatio, qui dicit, non qui negat...
Re[9]: потокобезопасный Singleton
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 09.08.05 15:43
Оценка:
Здравствуйте, vitaly_spb, Вы писали:

_>Синглтон не сильно увеличивает связность кода если действовать с умом. Если же пихать его куда ни попадя — то тогда действительно возникнут проблемы. Но во втором случае проблема не в синглтоне


Синглтон увеличивает связность в любом случае. Просто потому что он не полиморфен и полиморфным быть не может. Другое дело что не всегда эта связность приносит сильный вред, а простота применения синглтона очевидна. Ну и самое главное — я специально говорил о том, что использование публичных синглтонов плохо прежде всего в библиотеках. Если синглтон приватный, то обычно подправить его исходники несложно.
... << RSDN@Home 1.2.0 alpha rev. 599>>
AVK Blog
Re[10]: Потокобезопасный Singleton
От: Tom Россия http://www.RSDN.ru
Дата: 09.08.05 15:49
Оценка:
Здравствуйте, Lloyd, Вы писали:

L>Здравствуйте, Tom, Вы писали:


Tom>>в шарпе не нужно. Это самый лаконичный и потокобезопасный вариант


L>А теперь представь, что табе захотелось в класс Singleton добавить еще один какой-нить статический член. Тогда обращение Singleton.[какой-нить статический член] вызовет создание экземпляра Singleton, хотя на самом деле он вовсе не был нужен. Дабл-локинг или приватный внутренний класс решает эту проблему.


В даннос случае семантика обращения к данному члену будет такой же как если бы он был не статическим мембером по этому делать его статическим — бесмысленно
... << RSDN@Home 1.1.4 beta 4 rev. 303>>
Народная мудрось
всем все никому ничего(с).
Re[11]: Потокобезопасный Singleton
От: Lloyd Россия  
Дата: 09.08.05 15:53
Оценка:
Здравствуйте, Tom, Вы писали:

Tom>В даннос случае


В данном это в каком?

Tom>семантика обращения к данному члену будет такой же как если бы он был не статическим мембером по этому делать его статическим — бесмысленно


А можно то же самое, но попроще.
... << RSDN@Home 1.1.4 stable rev. 510>>
Re[10]: потокобезопасный Singleton
От: Аноним  
Дата: 09.08.05 15:54
Оценка:
AVK>Синглтон увеличивает связность в любом случае. Просто потому что он не полиморфен и полиморфным быть не может. Другое дело что не всегда эта связность приносит сильный вред, а простота применения синглтона очевидна. Ну и самое главное — я специально говорил о том, что использование публичных синглтонов плохо прежде всего в библиотеках. Если синглтон приватный, то обычно подправить его исходники несложно.

Не в любом случае. Опять же — он может никак не влиять на связность.
Re[12]: Потокобезопасный Singleton
От: Tom Россия http://www.RSDN.ru
Дата: 09.08.05 15:59
Оценка:
L>А можно то же самое, но попроще.

Суть в том что при использовании паттерна одиночка нет никакой разница вызывать статический метод или мембер.
т.е
Foo.Instance.Bar() = Foo.Bar()
... << RSDN@Home 1.1.4 beta 4 rev. 303>>
Народная мудрось
всем все никому ничего(с).
Re[11]: потокобезопасный Singleton
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 09.08.05 16:15
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>Не в любом случае. Опять же — он может никак не влиять на связность.


В принципе, если его вобще не использовать, может . А если серьезно, то примеры в студию.
... << RSDN@Home 1.2.0 alpha rev. 599>>
AVK Blog
Re[13]: Потокобезопасный Singleton
От: Lloyd Россия  
Дата: 09.08.05 17:22
Оценка:
Здравствуйте, Tom, Вы писали:

Tom>Суть в том что при использовании паттерна одиночка нет никакой разница вызывать статический метод или мембер.

Tom>т.е
Tom>Foo.Instance.Bar() = Foo.Bar()

Неужто? Заче тогда вообще городить Singleton, если нет никакой разницы между Singleton-ом и просто набором статических методов?
... << RSDN@Home 1.1.4 stable rev. 510>>
Re[13]: Потокобезопасный Singleton
От: Аноним  
Дата: 09.08.05 18:47
Оценка:
To AndrewVK:

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

Можно подтверждающий пример или ссылку на документацию?
Я всегда полагал, что статический конструктор вызывается при первом обращении к классу... Забавно, если это не так...

С уважением, Олег Аксенов.
MDNA


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Re[10]: Потокобезопасный Singleton
От: Andrbig  
Дата: 10.08.05 07:53
Оценка:
Здравствуйте, Lloyd, Вы писали:

L>Здравствуйте, Andrbig, Вы писали:


A>>ВЫВОД: Муть зеленая про двойной лок — исключительно для С++.


L>Re[9]: Потокобезопасный Singleton
Автор: Lloyd
Дата: 09.08.05


И что там? Что вызов статического метода вызовет создание статических переменных? Естественно. Для обычных методов создаются обычные переменные, для статических — статические. Если какому-то стат. методу не нужны стат. переменные данного класса, то какого хрена этот метод делает в данном классе? Это банальная ошибка дизайна. Или лень. Впрочем, и для таких любителей неполовых извращений есть простой выход:
    public sealed class Singleton 
    {
        private sealed class Core
        {
            private Core()
            {
            }
            public static readonly Singleton Instance = new Singleton();
        }
        private Singleton()
        {
        }
        public static Singleton Instance
        {
            get { return Core.Instance; }
        }
        public void Foo() // Этому методу нужен Instance
        {
        }
        public static void ok()  // Этому методу не нужен Instance
        {
        }
    }


Впрочем, если кто-то хочет извратиться еще больше, двери С++ открыты вая вас!

Так что я не поменял своего мнения про дабл-локинг: эта муть зеленая — исключительно для С++. Или кто-то хочет сказать, что сампальный велосипед будет работать лучше чем встроенные в .NET средства?

Я встречал этот дабл-локинг и коде MS. Ну там понятно — индусы выучили когда-то и теперь у них пыль столбом и только клавиши стучат: дабл-локинг, дабл-локинг, дабл-локинг... К сожалению, нежелание думать над дизайном и привычка переносить исключительно С++-ные паттерны на C# встречается не только среди индусской части программистов планеты.

L>Если что-то кажется тебе ошибочным, это не обязательно значит, что это ошибочно. Возможно ты просто не понял для чего это сделано.


Если что-то кажется тебе лучшим, это не обязательно значит, что это лучшее. Возможно ты просто не знаешь о более лучших вариантах.
Re[14]: Потокобезопасный Singleton
От: Tom Россия http://www.RSDN.ru
Дата: 10.08.05 08:17
Оценка:
Здравствуйте, Lloyd, Вы писали:

L>Здравствуйте, Tom, Вы писали:


Tom>>Суть в том что при использовании паттерна одиночка нет никакой разница вызывать статический метод или мембер.

Tom>>т.е
Tom>>Foo.Instance.Bar() = Foo.Bar()

L>Неужто? Заче тогда вообще городить Singleton, если нет никакой разницы между Singleton-ом и просто набором статических методов?


Затем, что бы был инстанс, что даём много возможностей, как то серилизацию итп...
Кстате если не согласен — может аргументируешь?
... << RSDN@Home 1.1.4 beta 4 rev. 303>>
Народная мудрось
всем все никому ничего(с).
Re[12]: Потокобезопасный Singleton
От: Andrbig  
Дата: 10.08.05 08:20
Оценка:
Здравствуйте, Lloyd, Вы писали:

L>Маладца. Переименовал внутренний класс и дописал пару методов. Ты по ветке-то поднимись и сравни то что ты написал и написал я.


Да, та же фигня. Но я говорил о дабл-локинге, как о совершенно ненужном в C# механизме.

L>С++ — то к чему здесь приплел?


К извращениям. Например, в MС++ можно бросить исключение, не производное от Exception.

L>Не спеши с выводами. Раз уж ты взялся рассуждать о дизайне, скажи пожалуйста, какую сущность выражает твой внутренний класс Core?


Этот класс выражает не сущьность, он — вынужденная мера, вызванная сваливанием в одну кучу (почему-то именуемую Singleton) разношерстных методов (кому нужны стат. переменные и кому они не нужны).

Раз уж ты спрашиваешь о дизане, расскажи, что делают в Singleton-е методы, не использующие статические переменные.
Re[15]: Потокобезопасный Singleton
От: Lloyd Россия  
Дата: 10.08.05 08:20
Оценка:
Здравствуйте, Tom, Вы писали:

Tom>Затем, что бы был инстанс, что даём много возможностей, как то серилизацию итп...

Tom>Кстате если не согласен — может аргументируешь?

Понятно. По четным дням значит разница есть, а по нечетным — нет?
... << RSDN@Home 1.1.4 stable rev. 510>>
Re[13]: Потокобезопасный Singleton
От: Lloyd Россия  
Дата: 10.08.05 08:29
Оценка:
Здравствуйте, Andrbig, Вы писали:

L>>Маладца. Переименовал внутренний класс и дописал пару методов. Ты по ветке-то поднимись и сравни то что ты написал и написал я.


A>Да, та же фигня. Но я говорил о дабл-локинге, как о совершенно ненужном в C# механизме.


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

L>>С++ — то к чему здесь приплел?


A>К извращениям. Например, в MС++ можно бросить исключение, не производное от Exception.


Это тема отделного разговора. Ничего криминального лично я в этой возможности не вижу.

L>>Не спеши с выводами. Раз уж ты взялся рассуждать о дизайне, скажи пожалуйста, какую сущность выражает твой внутренний класс Core?


A>Этот класс выражает не сущьность, он — вынужденная мера, вызванная сваливанием в одну кучу (почему-то именуемую Singleton) разношерстных методов (кому нужны стат. переменные и кому они не нужны).


То есть у этого подхода есть таки недостатки по-крайней мере с точки зрения дизайна. Не так ли?

A>Раз уж ты спрашиваешь о дизане, расскажи, что делают в Singleton-е методы, не использующие статические переменные.


Представления не имею. Написал их кто-то вот они что-то и делаеют. Да на самом деле, как показал AndrewVK, некорректное поведение возможно и в отсутствии 'посторонних' методов.
... << RSDN@Home 1.1.4 stable rev. 510>>
Re[16]: Потокобезопасный Singleton
От: Tom Россия http://www.RSDN.ru
Дата: 10.08.05 08:33
Оценка:
L>Понятно. По четным дням значит разница есть, а по нечетным — нет?
Делать метод из мембера статическим при использовании патерна одиночка смысла нет. Иметь инстанс смысл есть.
... << RSDN@Home 1.1.4 beta 4 rev. 303>>
Народная мудрось
всем все никому ничего(с).
Re[17]: Потокобезопасный Singleton
От: Lloyd Россия  
Дата: 10.08.05 08:41
Оценка:
Здравствуйте, Tom, Вы писали:

L>>Понятно. По четным дням значит разница есть, а по нечетным — нет?

Tom>Делать метод из мембера статическим при использовании патерна одиночка смысла нет. Иметь инстанс смысл есть.

А как ты убедишь компилятор при обращении к полю Singleton.Instance чтобы он возвращал Singleton.SingletonInstanceHolder.SingletonInstance.
Извини, но я не знаю как такое сделать.
... << RSDN@Home 1.1.4 stable rev. 510>>
Re[18]: Потокобезопасный Singleton
От: Tom Россия http://www.RSDN.ru
Дата: 10.08.05 08:42
Оценка:
Здравствуйте, Lloyd, Вы писали:

L>Здравствуйте, Tom, Вы писали:


L>>>Понятно. По четным дням значит разница есть, а по нечетным — нет?

Tom>>Делать метод из мембера статическим при использовании патерна одиночка смысла нет. Иметь инстанс смысл есть.

L>А как ты убедишь компилятор при обращении к полю Singleton.Instance чтобы он возвращал Singleton.SingletonInstanceHolder.SingletonInstance.

L>Извини, но я не знаю как такое сделать.

Я тоже ) Мне просто холдер не нужен
... << RSDN@Home 1.1.4 beta 4 rev. 303>>
Народная мудрось
всем все никому ничего(с).
Re[12]: потокобезопасный Singleton
От: Аноним  
Дата: 10.08.05 08:45
Оценка:
AVK>В принципе, если его вобще не использовать, может . А если серьезно, то примеры в студию.

Ну например тот же логгер-синглтон. Он никак не влияет на каплинг.
Re[14]: Потокобезопасный Singleton
От: Andrbig  
Дата: 10.08.05 08:52
Оценка:
Здравствуйте, Lloyd, Вы писали:

L>Не спеши. Вспоминаем бритву Оккама + тот факт, что ооп предполагает использование классов для 'обозначения' неких сущностей.

И?

L>Это тема отделного разговора. Ничего криминального лично я в этой возможности не вижу.

Согласен, отдельного. Поймай на C# это исключение и я тоже не стану видеть ничего криминального.

A>>Этот класс выражает не сущьность, он — вынужденная мера, вызванная сваливанием в одну кучу (почему-то именуемую Singleton) разношерстных методов (кому нужны стат. переменные и кому они не нужны).


L>То есть у этого подхода есть таки недостатки по-крайней мере с точки зрения дизайна. Не так ли?


Которого этого? Недостаточки с т.зр. дизайна есть у сваливания в одну кучу разношерстных методов.

L>Представления не имею. Написал их кто-то вот они что-то и делаеют.


Если никто не имеет предстваления и все всё сваливают все в кучу, то вообще сложно говорить о дизайне, не находишь?

L>Да на самом деле, как показал AndrewVK, некорректное поведение возможно и в отсутствии 'посторонних' методов.

Согласен. Для этого внутренний класс. Но уж никак не дабл-локинг.
Re[19]: Потокобезопасный Singleton
От: Lloyd Россия  
Дата: 10.08.05 08:54
Оценка:
Здравствуйте, Tom, Вы писали:

Tom>Я тоже ) Мне просто холдер не нужен


Я правильно понял твою мысль, что ты хотел сказать, что приватный внутренний класс ты считаешь ненужным?
... << RSDN@Home 1.1.4 stable rev. 510>>
Re[20]: Потокобезопасный Singleton
От: Tom Россия http://www.RSDN.ru
Дата: 10.08.05 08:56
Оценка:
L>Я правильно понял твою мысль, что ты хотел сказать, что приватный внутренний класс ты считаешь ненужным?
Правильно
... << RSDN@Home 1.1.4 beta 4 rev. 303>>
Народная мудрось
всем все никому ничего(с).
Re[15]: Потокобезопасный Singleton
От: Lloyd Россия  
Дата: 10.08.05 08:59
Оценка:
Здравствуйте, Andrbig, Вы писали:

A>Согласен, отдельного. Поймай на C# это исключение и я тоже не стану видеть ничего криминального.


Проще простого

catch {}


L>>То есть у этого подхода есть таки недостатки по-крайней мере с точки зрения дизайна. Не так ли?


A>Которого этого? Недостаточки с т.зр. дизайна есть у сваливания в одну кучу разношерстных методов.


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

L>>Да на самом деле, как показал AndrewVK, некорректное поведение возможно и в отсутствии 'посторонних' методов.

A>Согласен. Для этого внутренний класс. Но уж никак не дабл-локинг.

Внутренний класс — это привнесений лишней сущности в программу. А дядя Оккам нам крайне не советует делать этого без лишней на то необходимости.
... << RSDN@Home 1.1.4 stable rev. 510>>
Re[21]: Потокобезопасный Singleton
От: Lloyd Россия  
Дата: 10.08.05 09:01
Оценка:
Здравствуйте, Tom, Вы писали:

L>>Я правильно понял твою мысль, что ты хотел сказать, что приватный внутренний класс ты считаешь ненужным?

Tom>Правильно

Тогда прокомментируй пожалуйста пример который привел AndrewVK. Ты считаешь нормальной ситуацию когда синглтон создается хотя реального обращения к нему не было?
... << RSDN@Home 1.1.4 stable rev. 510>>
Re[16]: Потокобезопасный Singleton
От: Andrbig  
Дата: 10.08.05 09:11
Оценка:
Здравствуйте, Lloyd, Вы писали:

L>
L>catch {}
L>


И как ты отличишь, что именно ты поймал?

L>Я всегда считал, что в ооп классы служат для отображения сущностей предметной области, а не для того, чтобы избежать столь нелюбимого тобой дабл-локинга. Извини, если я ошибался.


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

L>Внутренний класс — это привнесений лишней сущности в программу. А дядя Оккам нам крайне не советует делать этого без лишней на то необходимости.


Я не уверен, что дядя Оккам знал про особенности .NET.
Re[22]: Потокобезопасный Singleton
От: Tom Россия http://www.RSDN.ru
Дата: 10.08.05 09:22
Оценка:
Здравствуйте, Lloyd, Вы писали:

L>Здравствуйте, Tom, Вы писали:


L>>>Я правильно понял твою мысль, что ты хотел сказать, что приватный внутренний класс ты считаешь ненужным?

Tom>>Правильно

L>Тогда прокомментируй пожалуйста пример который привел AndrewVK. Ты считаешь нормальной ситуацию когда синглтон создается хотя реального обращения к нему не было?

Ну создаётся. Никакой проблеммы тут нет. Обычно синглтоны создаются при старте приложения, и живут до его смерти. Если требуется что то более умное то нужно применять другой паттерт, позволяющий гибко управлять временем жизни обьекта.
... << RSDN@Home 1.1.4 beta 4 rev. 303>>
Народная мудрось
всем все никому ничего(с).
Re[17]: Потокобезопасный Singleton
От: Lloyd Россия  
Дата: 10.08.05 09:22
Оценка:
Здравствуйте, Andrbig, Вы писали:

A>И как ты отличишь, что именно ты поймал?


И на основе того, что в C#-е мы не можем этого сделать ты делаешь вывод о кривизне плюсов?

L>>Я всегда считал, что в ооп классы служат для отображения сущностей предметной области, а не для того, чтобы избежать столь нелюбимого тобой дабл-локинга. Извини, если я ошибался.


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


Для чего тебе это? Ты хочеь обсудить должны ли объекты использоваться как объекты или их можно использовать в том числе и для различных трюков? Если да, то этот вопрос не для этого форума.

A>Я не уверен, что дядя Оккам знал про особенности .NET.


Главное чтобы мы о нем не забывали.
... << RSDN@Home 1.1.4 stable rev. 510>>
Re[15]: Потокобезопасный Singleton
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 10.08.05 09:23
Оценка:
Здравствуйте, Andrbig, Вы писали:

L>>Да на самом деле, как показал AndrewVK, некорректное поведение возможно и в отсутствии 'посторонних' методов.

A>Согласен. Для этого внутренний класс. Но уж никак не дабл-локинг.

Иногда логика проверки и создания экземпляра синглтона значительно хитрее, нежели проверка на null. Например синглтон это файл конфигурации и при каждом обращении надо проверять, не изменился ли файл, и, если изменился, перегружать его. В таком случае условие проверки нужно в любом случае писать вручную и статические конструкторы никаким боком не прокатывают. Вот в этом случае, если нам нужна потокобезопасность, double check locking будет вполне нормальным паттерном (если не забывать про volatile). Даже на C#.
... << RSDN@Home 1.2.0 alpha rev. 599>>
AVK Blog
Re[23]: Потокобезопасный Singleton
От: Lloyd Россия  
Дата: 10.08.05 09:28
Оценка:
Здравствуйте, Tom, Вы писали:

Tom>Ну создаётся. Никакой проблеммы тут нет. Обычно синглтоны создаются при старте приложения, и живут до его смерти. Если требуется что то более умное то нужно применять другой паттерт, позволяющий гибко управлять временем жизни обьекта.


Ну а я считаю, что то, что существует должно существовать лишь постолько поскольку имеется в нем необходимость. Если необходимости в существовании экземпляра синглетона в данный момент нет, то он и не должен создаваться.
... << RSDN@Home 1.1.4 stable rev. 510>>
Re[16]: Потокобезопасный Singleton
От: Andrbig  
Дата: 10.08.05 09:30
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>Здравствуйте, Andrbig, Вы писали:


L>>>Да на самом деле, как показал AndrewVK, некорректное поведение возможно и в отсутствии 'посторонних' методов.

A>>Согласен. Для этого внутренний класс. Но уж никак не дабл-локинг.

AVK>Иногда логика проверки и создания экземпляра синглтона значительно хитрее, нежели проверка на null. Например синглтон это файл конфигурации и при каждом обращении надо проверять, не изменился ли файл, и, если изменился, перегружать его. В таком случае условие проверки нужно в любом случае писать вручную и статические конструкторы никаким боком не прокатывают. Вот в этом случае, если нам нужна потокобезопасность, double check locking будет вполне нормальным паттерном (если не забывать про volatile). Даже на C#.


Согласен. Но это лишь иногда. Для вполне определенных частных случаев.
Re[24]: Потокобезопасный Singleton
От: Tom Россия http://www.RSDN.ru
Дата: 10.08.05 09:38
Оценка:
L>Ну а я считаю, что то, что существует должно существовать лишь постолько поскольку имеется в нем необходимость. Если необходимости в существовании экземпляра синглетона в данный момент нет, то он и не должен создаваться.

Скажи в названии или описании паттерна синглтон есть упонимание про управление временем жизни?
... << RSDN@Home 1.1.4 beta 4 rev. 303>>
Народная мудрось
всем все никому ничего(с).
Re[18]: Потокобезопасный Singleton
От: Andrbig  
Дата: 10.08.05 09:38
Оценка:
Здравствуйте, Lloyd, Вы писали:

L>И на основе того, что в C#-е мы не можем этого сделать ты делаешь вывод о кривизне плюсов?


Не надо за меня додумывать. Я не говорил кривизна, я говорил извращение. Кривизна — ошибка, извращение — фича, которая есть, но нахрен не упала. Фича бросать .net-исключения, которые нельзя поймать в программе, написанной под .net — извращение, потому что ограничивает область применения данной программы только MC++ и потому нахрен не упала.

Если ты так не считаешь, напиши библиотеку на MC++, бросающую подобные исключения и попробуй ее кому-нибудь предложить к использованию.

L>>>Я всегда считал, что в ооп классы служат для отображения сущностей предметной области, а не для того, чтобы избежать столь нелюбимого тобой дабл-локинга. Извини, если я ошибался.


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


L>Для чего тебе это? Ты хочеь обсудить должны ли объекты использоваться как объекты или их можно использовать в том числе и для различных трюков? Если да, то этот вопрос не для этого форума.


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

L>Главное чтобы мы о нем не забывали.


Ленин и сейчас живее всех живых.
Re[25]: Потокобезопасный Singleton
От: Lloyd Россия  
Дата: 10.08.05 09:44
Оценка:
Здравствуйте, Tom, Вы писали:

Tom>Скажи в названии или описании паттерна синглтон есть упонимание про управление временем жизни?


Нет.
... << RSDN@Home 1.1.4 stable rev. 510>>
Re[14]: потокобезопасный Singleton
От: Аноним  
Дата: 10.08.05 09:51
Оценка:
AVK>Пусть нам понадобилось запустить код BizEntity в другой системе с совершенно иной реализацией логгера. В первом варианте нам нужно будет перетаскивать исходники и править все вызовы логгера. Во-втором случае достаточно реализовать ILogger, при том даже перекомпилировать BizEntity не понадобится.

Если ты бы знал что тебе это понадобится — легко можно было бы сделать логгер через Factory (которая кстати была бы синглтоном ).
Во втором случае ты просто используешь встроенную фабрику от микрософт.

AVK>Едем дальше — вместо одного экземпляра нам понадобилось иметь в программе несколько, например для каждой сессии отдельно. И опять та же история. В первом варианте требуется перетряхивать логгер, менять семантику метода Log, либо вместо свойства Instance делать метод, соотвественно править код BizEntity и т.п. Во-втором варианте достаточно в нужном месте в контекст подсунуть нужный экземпляр. Опять же, при этом даже не требуется перекомпиляция BizEntity.


Честно говоря, ты разберись что же тебе нужно Либо синглтон, либо тогда совсем можно не париться, объявить простой класс — и мороки с сервисами твоими не будет.

AVK>Третий вариант — нам нужно обеспечить подключение логгеров, написанных пользователем, путем указания имени класса в файле конфигурации. И опять та же история — перетряхать логгер, вводить механику выбора нужного экземпляра логгера.


см. log4net

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


Налицо плохое понимание зачем нужен логгер и как ты его будешь использовать
Re[18]: Потокобезопасный Singleton
От: Tom Россия http://www.RSDN.ru
Дата: 10.08.05 10:12
Оценка:
AVK>Интересно, а ты метод Reset, который должен пересоздавать экземпляр синглтона тоже методом экземпляра сделаешь?

А это чудо зачем мне???
... << RSDN@Home 1.1.4 beta 4 rev. 303>>
Народная мудрось
всем все никому ничего(с).
Re[15]: потокобезопасный Singleton
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 10.08.05 10:15
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>Если ты бы знал что тебе это понадобится — легко можно было бы сделать логгер через Factory (которая кстати была бы синглтоном ).


А если нет? На сегодня нормальная ситуация, когда спецификация проекта уточняется по мере его разработки. Что уж говорить о том, что может понадобится через некоторое время после выпуска первого релиза. С этой ситуацией приходится мирится, и, дабы минимизировать последствия, стараются проектировать в том числе менее связный код. А для этого применять синглтоны надо очень осторожно.

А>Честно говоря, ты разберись что же тебе нужно Либо синглтон, либо тогда совсем можно не париться, объявить простой класс — и мороки с сервисами твоими не будет.


Не, мужик. Когда нужно синглтон, это уже решение. А задача формулируется как обеспецение функционала логгирования и доступа к нему из прикладного кода.

AVK>>Третий вариант — нам нужно обеспечить подключение логгеров, написанных пользователем, путем указания имени класса в файле конфигурации. И опять та же история — перетряхать логгер, вводить механику выбора нужного экземпляра логгера.


А>см. log4net


Смотрел. И что? Мы же ведь говорим о паттернах, а не о конкретных решениях. Или ты при проектировании всегда выбираешь самое навороченное решение, так, на всякий случай?

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


А>Налицо плохое понимание зачем нужен логгер и как ты его будешь использовать


Это называется некооректный прием ведения спора.
... << RSDN@Home 1.2.0 alpha rev. 599>>
AVK Blog
Re[19]: Потокобезопасный Singleton
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 10.08.05 10:26
Оценка:
Здравствуйте, Tom, Вы писали:

AVK>>Интересно, а ты метод Reset, который должен пересоздавать экземпляр синглтона тоже методом экземпляра сделаешь?


Tom>А это чудо зачем мне???


Задача — по команде извне нужно пересоздать экземпляр синглтона. Как ты ее решишь?
... << RSDN@Home 1.2.0 alpha rev. 599>>
AVK Blog
Re[16]: потокобезопасный Singleton
От: Аноним  
Дата: 10.08.05 10:27
Оценка:
AVK>А если нет? На сегодня нормальная ситуация, когда спецификация проекта уточняется по мере его разработки. Что уж говорить о том, что может понадобится через некоторое время после выпуска первого релиза. С этой ситуацией приходится мирится, и, дабы минимизировать последствия, стараются проектировать в том числе менее связный код. А для этого применять синглтоны надо очень осторожно.

Тут дело не в спецификации Надо тебе несколько логгеров — пиши несколько; надо подменить один другим — подменяй. Синглтон тут лишь средство избежать ненужного создания класса.

AVK>Не, мужик. Когда нужно синглтон, это уже решение. А задача формулируется как обеспецение функционала логгирования и доступа к нему из прикладного кода.


Вот именно Надо упрощать ситуацию.

А>>см. log4net

AVK>Смотрел. И что? Мы же ведь говорим о паттернах, а не о конкретных решениях. Или ты при проектировании всегда выбираешь самое навороченное решение, так, на всякий случай?

log4net позволяет тебе использовать несколько логгеров путем указания имени класса тратататата... класс может быть и синглтоном и т.д.
PS: log4net не самое навороченное решение

А>>Налицо плохое понимание зачем нужен логгер и как ты его будешь использовать

AVK> Это называется некооректный прием ведения спора.

Re[20]: Потокобезопасный Singleton
От: Tom Россия http://www.RSDN.ru
Дата: 10.08.05 10:33
Оценка:
AVK>Задача — по команде извне нужно пересоздать экземпляр синглтона. Как ты ее решишь?
Это уже какой то другой паттерн
... << RSDN@Home 1.1.4 beta 4 rev. 303>>
Народная мудрось
всем все никому ничего(с).
Re[17]: потокобезопасный Singleton
От: mogadanez Чехия  
Дата: 10.08.05 10:34
Оценка:
Здравствуйте, <Аноним>, Вы писали:

AVK>>А если нет? На сегодня нормальная ситуация, когда спецификация проекта уточняется по мере его разработки. Что уж говорить о том, что может понадобится через некоторое время после выпуска первого релиза. С этой ситуацией приходится мирится, и, дабы минимизировать последствия, стараются проектировать в том числе менее связный код. А для этого применять синглтоны надо очень осторожно.


А>Тут дело не в спецификации Надо тебе несколько логгеров — пиши несколько; надо подменить один другим — подменяй. Синглтон тут лишь средство избежать ненужного создания класса.


Для этого есть и другие патерны..
тут
... << RSDN@Home 1.1.4 beta 6a rev. 436>>
Re[21]: Потокобезопасный Singleton
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 10.08.05 10:47
Оценка:
Здравствуйте, Tom, Вы писали:

AVK>>Задача — по команде извне нужно пересоздать экземпляр синглтона. Как ты ее решишь?

Tom>Это уже какой то другой паттерн

Почему же другой. Тот же синглтон, только слегка модифицированный. Паттерн это не какая то догма, это образец решения. Конкретное воплощение в коде может принимать разные формы.
... << RSDN@Home 1.2.0 alpha rev. 599>>
AVK Blog
Re[17]: потокобезопасный Singleton
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 10.08.05 10:47
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>Тут дело не в спецификации Надо тебе несколько логгеров — пиши несколько; надо подменить один другим — подменяй.


Так вот в этом собака и порылась. Если тебе сначало не надо, а потом надо, то синглтон существенно усложняет модификацию кода.

А> Синглтон тут лишь средство избежать ненужного создания класса.


Какого?

А>>>см. log4net

AVK>>Смотрел. И что? Мы же ведь говорим о паттернах, а не о конкретных решениях. Или ты при проектировании всегда выбираешь самое навороченное решение, так, на всякий случай?

А>log4net позволяет тебе использовать несколько логгеров путем указания имени класса тратататата... класс может быть и синглтоном и т.д.


И? Вывод из этого какой?
... << RSDN@Home 1.2.0 alpha rev. 599>>
AVK Blog
Re[22]: Потокобезопасный Singleton
От: Andrbig  
Дата: 10.08.05 10:54
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>Здравствуйте, Tom, Вы писали:


AVK>>>Задача — по команде извне нужно пересоздать экземпляр синглтона. Как ты ее решишь?

Tom>>Это уже какой то другой паттерн

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


Если синглтон слегка модифицированный, то и решение тоюе будет слегка модифицированным. А до сего момента речь вроде шла про чистые синглтоны.
Re[25]: Потокобезопасный Singleton
От: adontz Грузия http://adontz.wordpress.com/
Дата: 10.08.05 11:31
Оценка:
Здравствуйте, Merle, Вы писали:

M>Этот паттерн просто позволяет контролировать число экземпляров объекта, а то что как правило требуется только один экземпляр — это частный случай.


Это уже Multipleton вышел
A journey of a thousand miles must begin with a single step © Lau Tsu
Re[25]: Потокобезопасный Singleton
От: mogadanez Чехия  
Дата: 10.08.05 11:34
Оценка:
Здравствуйте, Merle, Вы писали:

M>Здравствуйте, mogadanez, Вы писали:


M>>Гарантирует, что у класса есть только один экземпляр, и предоставляет к нему глобальную точку доступа

M>Кстати, в общем случае, даже не один экземпляр.
M>Этот паттерн просто позволяет контролировать число экземпляров объекта, а то что как правило требуется только один экземпляр — это частный случай.

....цитата из книги Банды Четырех
... << RSDN@Home 1.1.4 beta 6a rev. 436>>
Re[26]: Потокобезопасный Singleton
От: Merle Австрия http://rsdn.ru
Дата: 10.08.05 11:49
Оценка:
Здравствуйте, mogadanez, Вы писали:

M>....цитата из книги Банды Четырех

Да байта ради.. Они конечно дядьки хорошие, но совсем уж так уж тоже не стоит...
Суть-то как раз в том, что он действительно позволяет контролировать количество экземпляров, а не только ограничиваться одним. Один из банды, Влиссидес кажется, тракторвал этот паттерн именно так и даже приводил пример реального использования в этом качестве. И Википедия так же утверждает, что экземпляров может быть и несколько...
... << RSDN@Home 1.1.4 beta 7 rev. 0>>
Мы уже победили, просто это еще не так заметно...
Re[14]: потокобезопасный Singleton
От: savaDAN  
Дата: 10.08.05 11:55
Оценка:
AVK>Пусть нам понадобилось запустить код BizEntity в другой системе с совершенно иной реализацией логгера. В первом варианте нам нужно будет перетаскивать исходники и править все вызовы логгера. Во-втором случае достаточно реализовать ILogger, при том даже перекомпилировать BizEntity не понадобится.
Т.е. вы предлагаете вместо синглтона использовать фабрику? Несомненно более гибкое решение (собно фабрику для этого и придумывали).
В другом вопрос: а как это влияет на связность? Теперь всем приложениям придется реализовывать ILogger

С точки зрения логгера — ну будет у вас в одном приложении Logger.Instance возвращать один логгер, а в другом — другой.

AVK>Едем дальше — вместо одного экземпляра нам понадобилось иметь в программе несколько, например для каждой сессии отдельно. И опять та же история. В первом варианте требуется перетряхивать логгер, менять семантику метода Log, либо вместо свойства Instance делать метод, соотвественно править код BizEntity и т.п. Во-втором варианте достаточно в нужном месте в контекст подсунуть нужный экземпляр. Опять же, при этом даже не требуется перекомпиляция BizEntity.

По мне так overhead небольшой — что менять Instance, что менять фабрику т.к. в любом случае придется перелопатить тонну кода клиентского

AVK>Третий вариант — нам нужно обеспечить подключение логгеров, написанных пользователем, путем указания имени класса в файле конфигурации. И опять та же история — перетряхать логгер, вводить механику выбора нужного экземпляра логгера.

ничем не отличается от предыдущего примера.

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

Но это не значит что всегда вместо синглтонов стоит делать фабрики. в том числе и для логгеров.
... << RSDN@Home 1.1.4 stable rev. 510>>
Re[18]: потокобезопасный Singleton
От: Аноним  
Дата: 10.08.05 12:18
Оценка:
А>>Тут дело не в спецификации Надо тебе несколько логгеров — пиши несколько; надо подменить один другим — подменяй.

AVK>Так вот в этом собака и порылась. Если тебе сначало не надо, а потом надо, то синглтон существенно усложняет модификацию кода.


Чем интересно? То есть твой пример с этим замечательным сервисом на основе интерфейса решает все? То же самое решит фабрика.

А>> Синглтон тут лишь средство избежать ненужного создания класса.

AVK>Какого?

Ненужного Каждый раз инстанс объекта не создается.

А>>log4net позволяет тебе использовать несколько логгеров путем указания имени класса тратататата... класс может быть и синглтоном и т.д.

AVK>И? Вывод из этого какой?

"Третий вариант — нам нужно обеспечить подключение логгеров, написанных пользователем, путем указания имени класса в файле конфигурации. И опять та же история — перетряхать логгер, вводить механику выбора нужного экземпляра логгера."

вывод очевиден — твой довод не верен, не надо ничего перетряхать.
Re[15]: потокобезопасный Singleton
От: Аноним  
Дата: 10.08.05 12:20
Оценка:
DAN>В другом вопрос: а как это влияет на связность? Теперь всем приложениям придется реализовывать ILogger

А до этого видимо нет? Посмотри на то что предложил AndrewVK, то же самое

DAN>По мне так overhead небольшой — что менять Instance, что менять фабрику т.к. в любом случае придется перелопатить тонну кода клиентского


Вот именно

DAN>Но это не значит что всегда вместо синглтонов стоит делать фабрики. в том числе и для логгеров.


Точно Именно это главное.
Re[15]: потокобезопасный Singleton
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 10.08.05 13:13
Оценка:
Здравствуйте, savaDAN, Вы писали:

DAN>В другом вопрос: а как это влияет на связность? Теперь всем приложениям придется реализовывать ILogger


Зачем?

DAN>С точки зрения логгера — ну будет у вас в одном приложении Logger.Instance возвращать один логгер, а в другом — другой.


Logger.Instance это реализация. Отделить интерфейс нам не удастся. Это значит, что максимум, что мы сможем обеспечить, это перенос исходников и точное совпадение полного имени логгера во всех приложениях.

AVK>>Едем дальше — вместо одного экземпляра нам понадобилось иметь в программе несколько, например для каждой сессии отдельно. И опять та же история. В первом варианте требуется перетряхивать логгер, менять семантику метода Log, либо вместо свойства Instance делать метод, соотвественно править код BizEntity и т.п. Во-втором варианте достаточно в нужном месте в контекст подсунуть нужный экземпляр. Опять же, при этом даже не требуется перекомпиляция BizEntity.

DAN>По мне так overhead небольшой — что менять Instance, что менять фабрику т.к. в любом случае придется перелопатить тонну кода клиентского

Зачем? Процесс создания экземпляра во втором варианте от прикладного кода скрыт. Его, при смене политики управления экземплярами, даже перекомпилировать не придется. А вот с синглтоном такое так просто уже не провернешь.

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

DAN>Но это не значит что всегда вместо синглтонов стоит делать фабрики. в том числе и для логгеров.

А я этого и не говорил.
... << RSDN@Home 1.2.0 alpha rev. 599>>
AVK Blog
Re[19]: потокобезопасный Singleton
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 10.08.05 13:13
Оценка:
Здравствуйте, <Аноним>, Вы писали:

AVK>>Так вот в этом собака и порылась. Если тебе сначало не надо, а потом надо, то синглтон существенно усложняет модификацию кода.


А>Чем интересно? То есть твой пример с этим замечательным сервисом на основе интерфейса решает все?


Нет. Но связность решения по сравнению с синглтоном значительно ниже.

А> То же самое решит фабрика.


А IServiceProvider и есть фабрика.

А>>> Синглтон тут лишь средство избежать ненужного создания класса.

AVK>>Какого?

А>Ненужного Каждый раз инстанс объекта не создается.


В этом топике определение синглтона уже приводили. Повторю:

Гарантирует, что у класса есть только один экземпляр, и предоставляет к нему глобальную точку доступа

Ничего про каждый раз тут не сказано. Алгоритм создания этим паттерном не специфицируется.

А>>>log4net позволяет тебе использовать несколько логгеров путем указания имени класса тратататата... класс может быть и синглтоном и т.д.

AVK>>И? Вывод из этого какой?

А>"Третий вариант — нам нужно обеспечить подключение логгеров, написанных пользователем, путем указания имени класса в файле конфигурации. И опять та же история — перетряхать логгер, вводить механику выбора нужного экземпляра логгера."


А>вывод очевиден — твой довод не верен, не надо ничего перетряхать.


Мой вывод касался исключительно связности, вызываемой синглтоном. Ничего про log4net я не писал, тем более что для получения экземпляра логгера он использует фабрику LogManager.
... << RSDN@Home 1.2.0 alpha rev. 599>>
AVK Blog
Re[20]: потокобезопасный Singleton
От: Аноним  
Дата: 10.08.05 13:23
Оценка:
AVK>А IServiceProvider и есть фабрика.
Я про это и говорил — "та же фабрика, но от микрософт"

AVK>В этом топике определение синглтона уже приводили. Повторю:

AVK>

Гарантирует, что у класса есть только один экземпляр, и предоставляет к нему глобальную точку доступа

AVK>Ничего про каждый раз тут не сказано. Алгоритм создания этим паттерном не специфицируется.

Создается за время работы приложения только один раз = не создается во время работы каждый раз когда тебе объект нужен.

AVK>Мой вывод касался исключительно связности, вызываемой синглтоном. Ничего про log4net я не писал, тем более что для получения экземпляра логгера он использует фабрику LogManager.


Я просто про то что не надо ничего перетряхать

Вообще, предлагаю и закрыть тему
Re[16]: потокобезопасный Singleton
От: Аноним  
Дата: 10.08.05 13:25
Оценка:
AVK>Logger.Instance это реализация. Отделить интерфейс нам не удастся. Это значит, что максимум, что мы сможем обеспечить, это перенос исходников и точное совпадение полного имени логгера во всех приложениях.

Logger : ILog
То есть такого быть не может? Может и еще как легко может.

AVK>Зачем? Процесс создания экземпляра во втором варианте от прикладного кода скрыт. Его, при смене политики управления экземплярами, даже перекомпилировать не придется. А вот с синглтоном такое так просто уже не провернешь.


ну тут фактори поможет. Но все равно иногда синглтоны нужны as is. Нельзя же в конце концов над всеми классами фактори строить. Можно кстати синглтон как обертку над каким-нибудь классом сделать.
Re[21]: потокобезопасный Singleton
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 10.08.05 13:34
Оценка:
Здравствуйте, <Аноним>, Вы писали:

AVK>>А IServiceProvider и есть фабрика.

А>Я про это и говорил — "та же фабрика, но от микрософт"

И?

AVK>>Мой вывод касался исключительно связности, вызываемой синглтоном. Ничего про log4net я не писал, тем более что для получения экземпляра логгера он использует фабрику LogManager.


А>Я просто про то что не надо ничего перетряхать


Если не использовать синглтон, то не надо.
... << RSDN@Home 1.2.0 alpha rev. 599>>
AVK Blog
Re[16]: потокобезопасный Singleton
От: savaDAN  
Дата: 10.08.05 13:39
Оценка:
DAN>>В другом вопрос: а как это влияет на связность? Теперь всем приложениям придется реализовывать ILogger
AVK>Зачем?

Пусть нам понадобилось запустить код BizEntity в другой системе с совершенно иной реализацией логгера. В первом варианте нам нужно будет перетаскивать исходники и править все вызовы логгера

.. А в вашем варианте приложению в которое вставляют BizEntity придется реализовывать ILogger интерфейс.
Т.е. от того что синглтон стал фабрикой _связность_ (как количество знаний данного класса о других классах) не изменилась.. она даже увеличилась: мало того что надо знать об ILogger, так еще и о Context-ах.

С другой стороны, кто мешает в разных системах делать в таком случае свои реализации Logger.Instance которые будут возвращать разные реализации (в разных системах) ILogger? Синглтоном он от этого имхо быть не перестанет.


DAN>>С точки зрения логгера — ну будет у вас в одном приложении Logger.Instance возвращать один логгер, а в другом — другой.

AVK>Logger.Instance это реализация. Отделить интерфейс нам не удастся. Это значит, что максимум, что мы сможем обеспечить, это перенос исходников и точное совпадение полного имени логгера во всех приложениях.
Упихивание разных логгеров в ILogger это по большому счету не одно и тоже?


AVK>>>Едем дальше — вместо одного экземпляра нам понадобилось иметь в программе несколько, например для каждой сессии отдельно. И опять та же история. В первом варианте требуется перетряхивать логгер, менять семантику метода Log, либо вместо свойства Instance делать метод, соотвественно править код BizEntity и т.п. Во-втором варианте достаточно в нужном месте в контекст подсунуть нужный экземпляр. Опять же, при этом даже не требуется перекомпиляция BizEntity.

DAN>>По мне так overhead небольшой — что менять Instance, что менять фабрику т.к. в любом случае придется перелопатить тонну кода клиентского
AVK>Зачем? Процесс создания экземпляра во втором варианте от прикладного кода скрыт. Его, при смене политики управления экземплярами, даже перекомпилировать не придется. А вот с синглтоном такое так просто уже не провернешь.
Тогда видимо я вас не так понял.

вместо одного экземпляра нам понадобилось иметь в программе несколько, например для каждой сессии отдельно.


        // do some work
        Context.GetService<ILogger>().Log("Work done");

Как без изменения клиентского кода можно будет сделать чтобы эта строка в одном месте писала в файл, а в другом эта же самая строка выводила.. ну хотя бы в другой файл?
Вот поэтому я и говорил — клиентский код придется менять.

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

DAN>>Но это не значит что всегда вместо синглтонов стоит делать фабрики. в том числе и для логгеров.

AVK>А я этого и не говорил.

Прошу прощения!
Беру свои слова обратно.
Я собственно тоже только хотел сказать что использование фабрики вместо синглтона связность не уменьшает
... << RSDN@Home 1.1.4 stable rev. 510>>
Re[17]: потокобезопасный Singleton
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 10.08.05 13:48
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>Logger : ILog

А>То есть такого быть не может? Может и еще как легко может.

Может. Но в ILog не может быть статического свойства Instance. А проблема именно в жесткой привязке прикладного кода к этому свойству.

AVK>>Зачем? Процесс создания экземпляра во втором варианте от прикладного кода скрыт. Его, при смене политики управления экземплярами, даже перекомпилировать не придется. А вот с синглтоном такое так просто уже не провернешь.


А>ну тут фактори поможет.


Поможет. Есть и другие, более сложные паттерны.

А> Но все равно иногда синглтоны нужны as is.


Не то чтобы нужны, но иногда их использовать проще. Я же не говорил, что их вобще использовать не стоит. Я говорил о том что они увеличивают связность программы, т.е. за все надо платить, в том числе и за удобство доступа. И, в случае библиотек, частенько такая плата оказывается неприемлемой.
... << RSDN@Home 1.2.0 alpha rev. 599>>
AVK Blog
Re[27]: Потокобезопасный Singleton
От: mogadanez Чехия  
Дата: 11.08.05 09:59
Оценка:
Здравствуйте, Merle, Вы писали:


M>Суть-то как раз в том, что он действительно позволяет контролировать количество экземпляров, а не только ограничиваться одним. Один из банды, Влиссидес кажется, тракторвал этот паттерн именно так и даже приводил пример реального использования в этом качестве. И Википедия так же утверждает, что экземпляров может быть и несколько...


кстати открыл щас книженцию Влиссидеса ( Доп штрихи к паттернам или как то так... ) там глава есть, "избавляемся от Синглтона", так там такое же определение.
... << RSDN@Home 1.1.4 beta 6a rev. 436>>
Re[28]: Потокобезопасный Singleton
От: Merle Австрия http://rsdn.ru
Дата: 11.08.05 10:42
Оценка:
Здравствуйте, mogadanez, Вы писали:

M>кстати открыл щас книженцию Влиссидеса ( Доп штрихи к паттернам или как то так... ) там глава есть, "избавляемся от Синглтона", так там такое же определение.

Ткое же — это какое? Там глава должна быть про безопасность и там в системе как раз используется синглтон, который именно контролирует количество объектов, а не ограничивает одним...
... << RSDN@Home 1.1.4 beta 7 rev. 0>>
Мы уже победили, просто это еще не так заметно...
Re[29]: Потокобезопасный Singleton
От: mogadanez Чехия  
Дата: 11.08.05 13:17
Оценка:
Здравствуйте, Merle, Вы писали:

M>Здравствуйте, mogadanez, Вы писали:


M>>кстати открыл щас книженцию Влиссидеса ( Доп штрихи к паттернам или как то так... ) там глава есть, "избавляемся от Синглтона", так там такое же определение.

M>Ткое же — это какое? Там глава должна быть про безопасность и там в системе как раз используется синглтон, который именно контролирует количество объектов, а не ограничивает одним...

Наверное другая книжка...

В общем не знаю как там у них написано, но имя у паттерна должно быть говорящим... Singleton — мне говорит что он может быть один. контролирующий число объектов я бы уже назвыал другим паттерном, хотя на вкус и цвет....
... << RSDN@Home 1.1.4 beta 6a rev. 436>>
Re[14]: Потокобезопасный Singleton
От: Аноним  
Дата: 11.08.05 14:05
Оценка:
>OA>Можно подтверждающий пример или ссылку на документацию?
>Можно.

А почему коструктором-то не воспользоваться?
То есть вместо
public static readonly Logger Instance = new Logger();

Написать:
public static readonly Logger Instance;
static Logger()
{
 Instance = new Logger();
}

Или с Holder'ом интереснее?

С уважением, Олег Аксенов.
MDNA


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Re[30]: Потокобезопасный Singleton
От: Merle Австрия http://rsdn.ru
Дата: 11.08.05 20:03
Оценка:
Здравствуйте, mogadanez, Вы писали:

M>Наверное другая книжка...

может быть...
Кстати, вот, цитата из собственно GoF, раздел "Результаты":

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


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

Да нет, паттерн-то абсолютно тот же, просто условия создания экземпляра чуть сложнее, не думаю, что имеет смысл выделять это в отдельный паттерн.
... << RSDN@Home 1.1.4 beta 6a rev. 0>>
Мы уже победили, просто это еще не так заметно...
Re[14]: Потокобезопасный Singleton
От: Аноним  
Дата: 12.08.05 06:47
Оценка:
2 OlegAxenow:

А разве
public static readonly Logger Instance = new Logger();

и
public static readonly Logger Instance;
static Logger()
{
 Instance = new Logger();
}

не одно и тоже?
И там и там экземпляр создается статическим конструктором.


В примере AndrewVK, синглтон создается только при непосредственном обращении к статическому свойству Instance. В то время как в Вашем примере, создание синглтона произойдет при любом обращении к классу Logger.
________________________________
Best regards, Oleg Ufaev
Rostov .Net User Group
Конкурсная заявка


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Re: потокобезопасный Singleton
От: King Oleg Украина http://kingoleg.livejournal.com
Дата: 12.08.05 08:19
Оценка:
Здравствуйте, adontz, Вы писали:

A>Мне тут стало интересно, такой синглтон потокобезопасный? Двух экземплятор не создасться?

A>
A>public class MySingleton
A>{
A>    private static MySingleton _instance = new MySingleton();
    
A>    public static MySingleton Instance
A>    {
A>        get
A>        {
A>            return _instance;
A>        }
A>    }
A>}
A>


Только C# интересует?
King Oleg
*Читайте DOC'и, они rules*
Re[25]: Потокобезопасный Singleton
От: VladD2 Российская Империя www.nemerle.org
Дата: 14.08.05 10:09
Оценка:
Здравствуйте, Merle, Вы писали:

M>Кстати, в общем случае, даже не один экземпляр.

M>Этот паттерн просто позволяет контролировать число экземпляров объекта, а то что как правило требуется только один экземпляр — это частный случай.

Вот это уже будет точно не синглтон. Все же сам смысл этого паттерна нарушается.
... << RSDN@Home 1.2.0 alpha rev. 591>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[27]: Потокобезопасный Singleton
От: VladD2 Российская Империя www.nemerle.org
Дата: 14.08.05 18:48
Оценка:
Здравствуйте, Merle, Вы писали:

VD>> Все же сам смысл этого паттерна нарушается.

M>И в чем же смысл?

А ты его определение прочитай.

M> Смысл именно в том, что ты можешь контролировать число объектов.


Нет смысл в предоставлении единой точки доступа к единственному экземляру объекта. В это паттерн и заглючается.

M> А один он тебе нужен или несколько — дело десятое.


Нет. Если так вольно эти паттерны трактовать, то тебя никто не сможет понять. Одна из задачь паттернов — это упрощение общения между программистами и дизайнерами.
... << RSDN@Home 1.2.0 alpha rev. 591>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[28]: Потокобезопасный Singleton
От: Merle Австрия http://rsdn.ru
Дата: 14.08.05 19:04
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>А ты его определение прочитай.

А ты почитай расширенное толкование...

VD>Нет смысл в предоставлении единой точки доступа к единственному экземляру объекта.

Не к единственному, а к необходимому числу объектов.

VD>Нет. Если так вольно эти паттерны трактовать, то тебя никто не сможет понять.

Чего же тут вольного?
... << RSDN@Home 1.1.4 beta 6a rev. 0>>
Мы уже победили, просто это еще не так заметно...
Re[28]: Потокобезопасный Singleton
От: Павел Кузнецов  
Дата: 14.08.05 19:23
Оценка:
VladD2,

> M> Смысл именно в том, что ты можешь контролировать число объектов.

>
> Нет смысл в предоставлении единой точки доступа к единственному экземляру объекта. В это паттерн и заглючается.

Не стоит так однобоко и категорично...

Вот цитата из классики (специально выискал по-русски):

Результаты
У паттерна одиночка есть определенные достоинства:
<...>

  • допускает переменное число экземпляров. Паттерн позволяет вам легко изменить свое решение и разрешить появление более одного экземпляра класса Singleton. Вы можете применять один и тот же подход для управления числом экземпляров, используемых в приложении. Изменить нужно будет лишь операцию, дающую доступ к экземпляру класса Singleton;

  • Если не ограничиться собственно работой GoF, а почитать еще и последующую работу Влиссидеса, где он более подробно останавливается на том, почему было решено ограничиться в обсуждении нюансов Singleton в первой книге, думаю, вопросы должны будут отпасть.
    Posted via RSDN NNTP Server 2.0 beta
    Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
    Re[29]: Потокобезопасный Singleton
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 15.08.05 11:03
    Оценка:
    Здравствуйте, Merle, Вы писали:

    VD>>А ты его определение прочитай.

    M>А ты почитай расширенное толкование...

    И что там?

    VD>>Нет смысл в предоставлении единой точки доступа к единственному экземляру объекта.

    M>Не к единственному, а к необходимому числу объектов.

    Под рукой нет книги, а Интернет медленный. Прведи, плиз, цитату в котрой об этом говорилось бы.
    ... << RSDN@Home 1.2.0 alpha rev. 591>>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
     
    Подождите ...
    Wait...
    Пока на собственное сообщение не было ответов, его можно удалить.