Innymi słowy, czy ten wątek implementacyjny Singleton jest bezpieczny:
public class Singleton
{
private static Singleton instance;
private Singleton() { }
static Singleton()
{
instance = new Singleton();
}
public static Singleton Instance
{
get { return instance; }
}
}
X
kończą się -1
nawet bez wątków . To nie jest kwestia bezpieczeństwa wątków. Zamiast tego inicjator x = -1
uruchamia się pierwszy (znajduje się we wcześniejszym wierszu kodu, niższym numerze wiersza). Następnie uruchamia się inicjalizator X = GetX()
, dzięki czemu wielkie litery są X
równe -1
. Następnie uruchamiany static C() { ... }
jest „jawny” konstruktor statyczny, inicjalizator typu , który zmienia tylko małe litery x
. Po tym wszystkim Main
metoda (lub Other
metoda) może kontynuować i czytać wielkie litery X
. Jego wartość będzie -1
, nawet z jednym wątkiem.
Instance
jednocześnie. Jeden z wątków zostanie poproszony o uruchomienie inicjatora typu (znanego również jako konstruktor statyczny). W międzyczasie wszystkie inne wątki, które chcą odczytaćInstance
właściwość, zostaną zablokowane do momentu zakończenia inicjalizacji typu. Dopiero po zakończeniu inicjalizacji pola wątki będą mogły uzyskaćInstance
wartość. Więc nikt nie widziInstance
bytunull
.