O padrão de verificação dupla é mencionado no artigo 48 do livro Java eficaz, e é apontado que esse padrão geralmente não é aplicável em Java. A estrutura desse padrão é a seguinte:
Public Resource GetResource () {if (Resource == NULL) {Synchronized (this) {if (Resource == NULL) {Resource = new Resource (); }}} retornar recursos; }Esse padrão é uma melhoria para o seguinte código:
public Sincronized Resource GetResource () {if (Resource == null) {Resource = new Resource (); } retornar recurso; }O objetivo deste código é atrasar a inicialização do recurso. Mas toda vez que você o acessa, você precisa sincronizar. Para reduzir a sobrecarga da sincronização, um modo de verificação dupla está disponível.
A razão pela qual o modo de verificação dupla é inválido em Java é que o tipo de referência não é seguro para a ausência de sincronização. Para tipos básicos, exceto o modo de verificação longo e duplo, duplo e duplo, é aplicável. Por exemplo, o código a seguir está correto:
Parte INT privada; public int getCount () {if (count == 0) {synchronized (this) {if (count == 0) {count = computEcount (); // um cálculo consumidor de tempo}}} retorna contagem; }O exposto acima é a conclusão geral sobre o idioma de check duas vezes em Java. Mas as coisas ainda não terminaram, porque o padrão de memória de Java também está sendo melhorado. Doug Lea escreveu em seu artigo: "De acordo com o mais recente modelo de memória JSR133 Java, se o tipo de referência for declarado como volátil, o modo de verificação dupla funcionará". Portanto, no futuro, você precisa usar o modo de verificação dupla em Java, você pode usar o seguinte código:
Recurso de Recurso Volátil Privado; Public Resource GetResource () {if (Resource == NULL) {Synchronized (this) {if (Resource == NULL) {Resource = new Resource (); }}} retornar recursos; }Obviamente, deve estar em Java que segue a especificação JSR133.
Portanto, a verificação dupla não está disponível no J2SE 1.4 ou versões anteriores devido a gravações fora da ordem ao sintonizar em multi-thread ou JVM. Esse problema foi corrigido no J2SE 5.0, e a palavra-chave volátil pode ser usada para garantir que os singletons em multi-threading.
classe pública Singleton {private Volatile Singleton Instância = NULL; public singleton getInstance () {if (instance == null) {synchronized (this) {if (instance == null) {instance = new singleton (); }} retornar a instância; }}O método recomendado é a inicialização do titular da demanda (IODH).
classe pública singleton {classe estática singletonsholder {static singleton instance = new singleton (); } public static singleton getInstance () {return singletonholder.instance; }}O exposto acima é tudo sobre este artigo, espero que seja útil para todos aprenderem a programação Java.