Іншими словами, чи безпечний цей потік реалізації 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
.