1

Статические инициализаторы должны выполняться один раз перед первой ссылкой на класс. Это означает, что при каждом доступе к классу выполняется проверка, выполняются ли статические инициализаторы для класса.
Похоже, что в многопоточных средах классы с нетривиальными статическими инициализаторами могут быть источником конфликтов из-за необходимости синхронизации, когда к классу обращаются несколько потоков.
Вопрос: каким образом можно минимизировать влияние таких неявных блокировок на определения классов, введенные статическими инициализаторами?Статические инициализаторы и синхронизация потоков (.NET)

ответ

1

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

  • Экземпляр класса создается.
  • Любой из статических членов класса ссылаются

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

1

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

+0

хорошо ... как новообращенная нить знает, что класс уже загружен? ему все же приходится говорить с чем-то центральным, чтобы это выяснить. – kolosy

+2

Это обязанности виртуальной машины. Если у виртуальной машины нет никаких умных трюков/блокировок, чтобы реализовать это, я бы не хотел разрабатывать одно приложение .NET когда-либо. – nos

+1

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

0

Спецификации говорят: «Выполнено в зависящее от реализации время до первого использования статического поля этого класса».

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

+0

Я больше на стороне надежды. Рональд Рейган обычно говорил: «Доверяй не проверяй» или, по-английски, доверять, но проверить. Можете ли вы придумать какой-либо способ проверить, что статические инициализаторы не должны быть проблемой? – mfeingold

0

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

Ник.

 Смежные вопросы

  • Нет связанных вопросов^_^