Ответ 1
Jon Skeet имеет приятный article в синглтонах, обсуждающих эту проблему.
У меня есть кеш объекта, который реализует шаблон проектирования Singleton. Мой подход к singleton всегда ленился загружать статический экземпляр, когда свойство сначала получает доступ.
public static Widget
{
get
{
if(instance==null) instance = new Widget();
return instance;
}
}
Тем не менее, я знаю, что этот подход не является потокобезопасным, а проверка на наличие экземпляра null означает небольшую неэффективность. Было бы разумно реализовать статический конструктор класса, который создает экземпляр статического экземпляра?
Как я понимаю, статический конструктор будет вызываться всякий раз, когда возникает первый доступ к статическому свойству. Является ли это допустимым, и будет ли он предоставлять какие-либо преимущества по сравнению с текущим ленивым подходом или было бы лучше изучить реализацию прокси-сервера или использовать блокировку, чтобы заставить ее быть потокобезопасной?
public static Widget
{
get
{
if(instance==null)
{
lock(padlock)
{
if(instance==null) instance = new Widget();
}
}
return instance;
}
}
У меня нет большого опыта работы со статическими конструкторами, поэтому не хочу вникать в эту идею, если это равная или худшая реализация свойства ленивой загрузки.
Cheers, Gary
Jon Skeet имеет приятный article в синглтонах, обсуждающих эту проблему.
Вместо того, чтобы перематывать свой собственный потокобезопасный ленивый инициализатор и, возможно, ошибаться, я рекомендую просто использовать ленивый класс инициализатора Joe Duffy.
http://www.bluebytesoftware.com/blog/PermaLink,guid,a2787ef6-ade6-4818-846a-2b2fd8bb752b.aspx