Вы задали здесь только один вопрос, но есть приблизительно дюжина вопросов, которые вы должны были бы задать, поэтому я отвечу на них все.
Вот последовательность, которую я предположил
- Начало конструктора класса (также известного как
cctor
)
- Конец cctor
- начало основного
- начало MyMethod
Это правильно?
Нет. Правильная последовательность:
- Запуск cctor для Программы, если он есть. Там нет.
- Конец cctor для Программы, если он есть. Там нет.
- Начало основного
- Начало cctor для MyClass
- Конец cctor для MyClass
- Запуск MyClass.MyMethod
Что если есть инициализатор статического поля?
CLR разрешено изменять порядок, в котором в некоторых случаях запускаются инициализаторы статического поля. Подробности смотрите на странице Джона:
Различия между статическими конструкторами и инициализаторами типов
Возможно ли когда-либо вызвать статический метод, такой как MyMethod
, до того, как завершится cctor этого класса?
Да. Если cctor сам вызывает MyMethod, то, очевидно, MyMethod будет вызываться до завершения действия cctor.
Сектор не вызывает MyMethod. Возможно ли когда-нибудь вызвать статический метод, такой как MyMethod
, до того, как cctor MyClass завершит работу?
Да. Если cctor использует другой тип, чей cctor вызывает MyMethod, то MyMethod будет вызываться до завершения cctor MyClass.
Никакие акторы не вызывают MyMethod, прямо или косвенно! Теперь возможно ли вызвать статический метод, такой как MyMethod
, до того, как cctor MyClass завершит работу?
номер
Это все еще верно, даже если задействовано несколько потоков?
Да. Cctor завершится в одном потоке, прежде чем статический метод может быть вызван в любом потоке.
Можно ли вызвать cctor более одного раза? Предположим, что два потока приводят к запуску cctor.
Cctor гарантированно будет вызываться не более одного раза, независимо от количества задействованных потоков. Если два потока вызывают MyMethod «одновременно», они участвуют в гонке. Один из них проигрывает гонку и блокирует, пока cctor MyClass не завершится в выигрышном потоке.
Потеряная нить блокирует до тех пор, пока не будет завершен цикл? Действительно
Действительно.
Так что, если cctor в потоке Победа вызывает код, который блокирует блокировку, ранее принятую потоком проигрыш ?
Тогда у вас есть классическое условие инверсии порядка блокировки. Ваша программа блокируется. Навсегда.
Это кажется опасным. Как я могу избежать тупика?
Если тебе больно, когда ты это делаешь, тогда прекрати делать это . Никогда не делайте то, что может заблокировать в cctor.
Является ли хорошей идеей полагаться на семантику инициализации cctor для обеспечения сложных требований безопасности? И это хорошая идея иметь cctor, который взаимодействует с пользователем?
Нет и хороших идей. Мой совет заключается в том, что вы должны найти другой способ обеспечить выполнение требований ваших методов, влияющих на безопасность.