En otras palabras, ¿es seguro este hilo de implementación de Singleton?
public class Singleton
{
private static Singleton instance;
private Singleton() { }
static Singleton()
{
instance = new Singleton();
}
public static Singleton Instance
{
get { return instance; }
}
}
X
terminan siendo -1
incluso sin subprocesos . No es un problema de seguridad de hilos. En cambio, el inicializador se x = -1
ejecuta primero (está en una línea anterior en el código, un número de línea inferior). Luego se X = GetX()
ejecuta el inicializador , lo que hace que las mayúsculas sean X
iguales a -1
. Y luego el constructor estático "explícito", se static C() { ... }
ejecuta el inicializador de tipo , que cambia solo en minúsculas x
. Entonces, después de todo eso, el Main
método (o Other
método) puede continuar y leer mayúsculas X
. Su valor será -1
, incluso con un solo hilo.
Instance
a la vez. Se le indicará a uno de los hilos que primero ejecute el inicializador de tipo (también conocido como el constructor estático). Mientras tanto, todos los otros hilos que quieran leer laInstance
propiedad se bloquearán hasta que el inicializador de tipo haya finalizado. Solo después de que el inicializador de campo haya concluido, se permitirá que los hilos obtengan elInstance
valor. Entonces nadie puede ver elInstance
sernull
.