Em outras palavras, esse segmento de implementação Singleton é seguro:
public class Singleton
{
private static Singleton instance;
private Singleton() { }
static Singleton()
{
instance = new Singleton();
}
public static Singleton Instance
{
get { return instance; }
}
}
Xacabam sendo iguais, -1 sem o uso de threads . Não é um problema de segurança de threads. Em vez disso, o inicializador x = -1é executado primeiro (ele está em uma linha anterior do código, um número de linha inferior). Em seguida, o inicializador X = GetX()é executado, o que torna maiúscula Xigual a -1. E, em seguida, o construtor estático "explícito", o inicializador de tipo static C() { ... }é executado, que muda apenas em minúsculas x. Então, depois de tudo isso, o Mainmétodo (ou Othermétodo) pode continuar e ler maiúsculas X. Seu valor será -1, mesmo com apenas um segmento.
Instanceuma só vez. Um dos threads será instruído a executar primeiro o inicializador de tipo (também conhecido como construtor estático). Enquanto isso, todos os outros threads que desejam ler aInstancepropriedade serão bloqueados até que o inicializador de tipo termine. Somente após a conclusão do inicializador de campo, os segmentos poderão obter oInstancevalor. Então ninguém pode ver oInstancesernull.