Статические инициализаторы и синхронизация потоков (.NET)
Статические инициализаторы должны выполняться один раз перед первой ссылкой на класс. Это означает, что каждый раз, когда к классу обращаются, должна выполняться проверка, выполняются ли статические инициализаторы для класса.
Кажется, что в многопоточных средах классы с нетривиальными статическими инициализаторами могут быть источником раздора из-за синхронизации, необходимой, когда к классу получают доступ несколько потоков.
Мой вопрос заключается в том, каков наилучший способ минимизировать влияние таких неявных блокировок на определения классов, представленные статическими инициализаторами?
4 ответа
Выполнение статического конструктора инициируется первым из следующих событий, происходящих в домене приложения:
- Экземпляр класса создан.
- Все статические члены класса имеют ссылки
Ответственность за обработку проблем параллелизма при вызове статических конструкторов должна лежать на загрузчике классов.
Я не думаю, что есть много разногласий. Инициализаторы запускаются при загрузке класса. Если класс уже загружен, никаких проверок не должно быть.
В спецификациях говорится "выполняется в зависимости от реализации до первого использования статического поля этого класса".
Таким образом, можно предположить (или надеяться, если вы пессимистичны), что реализация выяснила, что им нужно заботиться о синхронизации потоков.
Я считаю, что это работает как часть компиляции JIT. После того, как статический инициализатор был подключен и запущен, ему больше не нужно запускать его и, следовательно, не возникает проблем с синхронизацией с несколькими потоками. И, конечно, двигатель JIT будет поточно-ориентированным.
Ник.