Безопасность потока при инициализации статического поля только для чтения

Если вы создаете статический член с readonly следующим образом:

public sealed class MyClass
{
    public readonly static MyClass Instance = new MyClass();
}

Мы знаем, что статический конструктор инициализирует поле MyClass.Instance, если какой-либо поток обращается к MyClass за кулак. Но будет ли один экземпляр (в данном случае MyClass) создан, если несколько потоков все одновременно обращаются к MyClass (т.е. Является инициализацией статического поля в потоковом режиме)?

Ответ 1

.NET CLR гарантирует, что статическая инициализация всегда потокобезопасна. Независимо от того, сколько потоков обращается к нему и какой порядок, он всегда будет инициализирован один раз.

Ваш код, кажется, показывает признаки начала шаблона Singleton.
В принципе, если вы хотите запустить собственный код перед инициализацией класса, вам необходимо обеспечить безопасность потоков самостоятельно.
Это пример, в котором вам нужно будет сделать свой пользовательский поток кода безопасным. Но статическая часть инициализации всегда надежна в потоке.

Ответ 2

Инициализация класса гарантируется спецификацией языка С# для обеспечения потокобезопасности, поэтому будет создан только один экземпляр MyClass. Вам нужно будет обеспечить безопасность потока с этого момента самостоятельно. Здесь ссылка MSDN:

http://msdn.microsoft.com/en-us/library/aa645612.aspx