Іншими словами, чи безпечний цей потік реалізації Singleton:
public class Singleton
{
private static Singleton instance;
private Singleton() { }
static Singleton()
{
instance = new Singleton();
}
public static Singleton Instance
{
get { return instance; }
}
}
Xзакінчуються -1 навіть без нарізки . Це не питання безпеки потоку. Натомість ініціалізатор x = -1запускається спочатку (він знаходиться на попередньому рядку в коді, нижній номер рядка). Потім X = GetX()запускається ініціалізатор , що робить верхній регістр Xрівним -1. І тоді «явний» статичний конструктор static C() { ... }запускає ініціалізатор типу , який змінюється лише малі регістри x. Тож після цього Mainметод (або Otherметод) може продовжувати і читати великі регістри X. Його значення буде -1навіть з однією ниткою.
Instanceодразу. Одному з потоків буде запропоновано спочатку запустити ініціалізатор типу (також відомий як статичний конструктор). Тим часом всі інші потоки, які бажають прочитатиInstanceвластивість, будуть заблоковані, поки ініціалізатор типу не закінчиться. Лише після того, як ініціалізатор поля завершиться, потокам буде дозволено отриматиInstanceзначення. Так що ніхто не може бачитиInstanceістотаnull.