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