In altre parole, questo thread di implementazione di Singleton è sicuro:
public class Singleton
{
private static Singleton instance;
private Singleton() { }
static Singleton()
{
instance = new Singleton();
}
public static Singleton Instance
{
get { return instance; }
}
}
Xfiniscono per essere -1 anche senza thread . Non è un problema di sicurezza del thread. Al contrario, l'inizializzatore x = -1viene eseguito per primo (è su una riga precedente nel codice, un numero di riga inferiore). Quindi viene X = GetX()eseguito l'inizializzatore , il che rende maiuscolo Xuguale a -1. E poi il costruttore "esplicito" statico, viene static C() { ... }eseguito il tipo inizializzatore , che cambia solo in minuscolo x. Quindi, dopo tutto ciò, il Mainmetodo (o Othermetodo) può andare avanti e leggere in maiuscolo X. Il suo valore sarà -1, anche con un solo thread.
Instancecontemporaneamente. A uno dei thread verrà chiesto di eseguire prima l'inizializzatore del tipo (noto anche come costruttore statico). Nel frattempo, tutti gli altri thread che desiderano leggere laInstanceproprietà verranno bloccati fino al termine dell'inizializzazione del tipo. Solo dopo la conclusione dell'inizializzatore di campo, i thread potranno ottenere ilInstancevalore. Quindi nessuno può vedere l'Instanceesserenull.