Являются ли открытые статические члены (свойства) статического потока безопасными

У меня есть образец статического класса

public static class SampleClass
   {
    private static readonly string _personName;
    private static readonly string _country;

    static SampleClass()
    {
        _personName = "JourneyMan";
        _country = "Zee";
        System.Threading.Thread.Sleep(5000);
    }

    public static string PersonName
    {
        get { return _personName; }
    }

    public static string Country
    {
        get { return _country; }
    }
}

Я специально ввел Thread.Sleep в статический конструктор.

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

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

Это обрабатывается для нас? или я что-то не так делаю?

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

Спасибо

2 ответа

Решение

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

Статический конструктор является потокобезопасным, статических свойств нет.

Статические конструкторы гарантированно будут запускаться только один раз в домене приложения до создания каких-либо экземпляров класса или доступа к любым статическим членам. http://msdn.microsoft.com/en-us/library/aa645612.aspx

Другие вопросы по тегам