Состояние гонки в статическом конструкторе C#
Я спорил с другом, который утверждает, что статический конструктор может уступить условию гонки, так как статический конструктор можно вызывать несколько раз. Кажется, это может произойти только в многопоточных средах с большим объемом. Это вообще возможно?
Я не мог найти никаких документов, чтобы доказать, что он неправ. У кого-нибудь есть понимание этого?
Спасибо!
2 ответа
Статический конструктор вызывается только один раз для каждого AppDomain.
ECMA-335 заявляет, что CLI должен гарантировать, что:
"Инициализатор типа должен быть выполнен ровно один раз для любого данного типа, если это явно не вызвано кодом пользователя".
И я не слышал об удобном способе вызова инициализаторов типов в C#.
Проблемы могут возникнуть только в том случае, если вы создаете циклические зависимости между инициализаторами типа.
Смотрите здесь интересную статью по этому вопросу:
https://msmvps.com/blogs/jon_skeet/archive/2012/04/07/type-initializer-circular-dependencies.aspx)
Это вообще возможно?
Нет. CLR обрабатывает это для вас и предотвращает вызов статических конструкторов более одного раза.
Это прописано несколько раз в спецификации языка C#. Например, в разделе 3.1 говорится:
статический конструктор для типа запускается не более одного раза для каждого домена приложения.