Mit anderen Worten, ist dieser Singleton-Implementierungsthread sicher:
public class Singleton
{
private static Singleton instance;
private Singleton() { }
static Singleton()
{
instance = new Singleton();
}
public static Singleton Instance
{
get { return instance; }
}
}
X
enden als -1
auch ohne Einfädeln . Es ist kein Thread-Sicherheitsproblem. Stattdessen wird der Initialisierer x = -1
zuerst ausgeführt (er befindet sich in einer früheren Zeile im Code, einer niedrigeren Zeilennummer). Dann wird der Initialisierer ausgeführt X = GetX()
, wodurch Großbuchstaben X
gleich werden -1
. Und dann wird der "explizite" statische Konstruktor, der Typinitialisierer static C() { ... }
, ausgeführt, der nur Kleinbuchstaben ändert x
. Nach all dem kann die Main
Methode (oder Other
Methode) fortfahren und Großbuchstaben lesen X
. Sein Wert wird -1
auch mit nur einem Thread sein.
Instance
gleichzeitig erhalten. Einer der Threads wird angewiesen, zuerst den Typinitialisierer (auch als statischer Konstruktor bezeichnet) auszuführen. In der Zwischenzeit werden alle anderen Threads, die dieInstance
Eigenschaft lesen möchten, gesperrt, bis der Typinitialisierer abgeschlossen ist. Erst nach Abschluss des Feldinitialisierers können Threads denInstance
Wert abrufen. So kann niemand dasInstance
Sein sehennull
.