Serie de resúmenes de exámenes escritos: ¡escriba un solo caso! Carga diferida, seguro para subprocesos, alto rendimiento

¡Escribe un singleton! Carga diferida, seguro para subprocesos, alto rendimiento

La carga diferida mencionada anteriormente, la llamada carga diferida significa que la clase correspondiente se carga cuando el objeto se usa realmente; de ​​lo contrario, es solo una declaración y no se gastan recursos para inicializar el objeto.

Primero vienen los más básicos y fáciles

public class Singleton {
    
      
    private Singleton() {
    
    }  //私有的构造函数
    private static Singleton instance = null;  
    public static Singleton getInstance() {
    
      
        if(instance == null) {
    
      
            instance = new Singleton();  
        }  
        return instance;  
    }  
}

Cual es su problema?

En un solo subproceso, está bien, pero en varios subprocesos, si varios subprocesos llaman a getInstance al mismo tiempo, se puede llamar a new varias veces, lo que causará problemas.

¿Cómo lidiar con ello?

Piense en usar bloqueos, sincronizados y otros métodos.

Cerradura de doble verificación correcta

Primero determine si el objeto se ha inicializado y luego decida si bloquearlo.

public class Singleton {
    
    
    private volatile static Singleton uniqueSingleton;

    private Singleton() {
    
    
    }

    public Singleton getInstance() {
    
    
        if (null == uniqueSingleton) {
    
    
            synchronized (Singleton.class) {
    
    
                if (null == uniqueSingleton) {
    
    
                    uniqueSingleton = new Singleton();
                }
            }
        }
        return uniqueSingleton;
    }
}

Método de clase interna estática

Podemos poner la instancia de Singleton en una clase interna estática, lo que evita la creación de objetos cuando se carga la clase Singleton, y dado que la clase interna estática solo se cargará una vez, este método de escritura también es seguro para subprocesos.

public class Singleton {
    
    
    private static class Holder {
    
    
        private static Singleton singleton = new Singleton();
    }
    
    private Singleton(){
    
    }
        
    public static Singleton getSingleton(){
    
    
        return Holder.singleton;
    }
}

Supongo que te gusta

Origin blog.csdn.net/weixin_43337081/article/details/109086603
Recomendado
Clasificación