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; }
}
}
X
acabam 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 X
igual 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 Main
método (ou Other
método) pode continuar e ler maiúsculas X
. Seu valor será -1
, mesmo com apenas um segmento.
Instance
uma 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 aInstance
propriedade 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 oInstance
valor. Então ninguém pode ver oInstance
sernull
.