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; }
}
}
Xterminan siendo -1 incluso sin subprocesos . No es un problema de seguridad de hilos. En cambio, el inicializador se x = -1ejecuta 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 Xiguales 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 Mainmétodo (o Othermétodo) puede continuar y leer mayúsculas X. Su valor será -1, incluso con un solo hilo.
Instancea 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 laInstancepropiedad 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 elInstancevalor. Entonces nadie puede ver elInstancesernull.