Подтвердить что ты не робот

Класс Static Constructor & Singleton

У меня есть кеш объекта, который реализует шаблон проектирования 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

4b9b3361

Ответ 1

Jon Skeet имеет приятный article в синглтонах, обсуждающих эту проблему.