Статические инициализаторы и синхронизация потоков (.NET)

Статические инициализаторы должны выполняться один раз перед первой ссылкой на класс. Это означает, что каждый раз, когда к классу обращаются, должна выполняться проверка, выполняются ли статические инициализаторы для класса.
Кажется, что в многопоточных средах классы с нетривиальными статическими инициализаторами могут быть источником раздора из-за синхронизации, необходимой, когда к классу получают доступ несколько потоков.
Мой вопрос заключается в том, каков наилучший способ минимизировать влияние таких неявных блокировок на определения классов, представленные статическими инициализаторами?

4 ответа

Решение

Выполнение статического конструктора инициируется первым из следующих событий, происходящих в домене приложения:

  • Экземпляр класса создан.
  • Все статические члены класса имеют ссылки

Ответственность за обработку проблем параллелизма при вызове статических конструкторов должна лежать на загрузчике классов.

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

В спецификациях говорится "выполняется в зависимости от реализации до первого использования статического поля этого класса".

Таким образом, можно предположить (или надеяться, если вы пессимистичны), что реализация выяснила, что им нужно заботиться о синхронизации потоков.

Я считаю, что это работает как часть компиляции JIT. После того, как статический инициализатор был подключен и запущен, ему больше не нужно запускать его и, следовательно, не возникает проблем с синхронизацией с несколькими потоками. И, конечно, двигатель JIT будет поточно-ориентированным.

Ник.

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