Читаю тут книжку по 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 инициализацию, в классе должен быть только один статический публичный член, который и будет обеспечивать доступ к экзепляру. Только так мы сможем предотвратить инициализацию экземпляра раньше того момента, когда он может понадобиться.
На мой взгляд, это не самое большое ограничение.
Showing posts with label Patterns. Show all posts
Showing posts with label Patterns. Show all posts
2007-12-04
Subscribe to:
Posts (Atom)