2007-12-04

Singleton в .NET

Читаю тут книжку по C# и .NET 2.0. Столкнулся с новым для себя моментом - volatile keyword. Начал выяснять, где его можно использовать. Друг показал на статью http://msdn2.microsoft.com/en-us/library/ms954629.aspx. В этой статье рассказывается про потокобезопасную реализацию Singleton. Сначала в C++, потом решение портируется на Java и C#. Тут как раз и появляются volatile поля. Ну а в нагрузку и два if с lock.
А дальше идёт другой пример на C#:
sealed class Singleton
{
  private Singleton() {}
  public static readonly Singleton Instance = new Singleton();
}
Мне не сильно нравится использовать прямой доступ к полям, поэтому я его немного изменил:
public sealed class Singleton
{
  private static readonly Singleton _instance = new Singleton();
  private Singleton() { }
  public static Singleton Instance
  {
    get { return _instance; }
  }
}
Так, а что с потокобезопасностью в этом случае?
Платформа .NET гарантирует потокобезопасную инициализацию статических членов. То есть гарантирует, что всегда будет создан только один экземпляр класса.
А вот с lazy инициализацией не всё так просто. Статические поля инициализируются при первом обращении к любому члену класса. То есть, в данном случае, чтобы иметь lazy инициализацию, в классе должен быть только один статический публичный член, который и будет обеспечивать доступ к экзепляру. Только так мы сможем предотвратить инициализацию экземпляра раньше того момента, когда он может понадобиться.
На мой взгляд, это не самое большое ограничение.

No comments: