Другими словами, безопасен ли этот поток реализации 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.