Статические инициализаторы и синхронизация потоков (.NET) - PullRequest
1 голос
/ 25 июня 2009

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

Ответы [ 4 ]

1 голос
/ 10 августа 2009

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

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

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

1 голос
/ 25 июня 2009

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

0 голосов
/ 24 июля 2009

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

Ник.

0 голосов
/ 25 июня 2009

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

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

...