Patrón de diseño - patrón singleton (1)

Patrón de diseño - patrón singleton (1)

1. Seis formas de escribir el modo singleton

(1) Modo hombre hambriento

public class Singleton {

    private static Singleton singleton = new Singleton();

    public Singleton() {
    }

    public static Singleton getInstance() {
        return singleton;
    }

}
  • 1. Este método se ha inicializado durante el proceso de carga de clases, por lo que la velocidad de carga es más lenta, pero la velocidad de adquisición de objetos es rápida.

  • 2. Basado en el mecanismo de carga de clases, se evita el problema de sincronización de subprocesos múltiples. La creación de instancias se completa cuando se carga la clase y no se logra el efecto de la carga diferida. memoria fácil de desperdiciar


(2) Modo perezoso (subproceso inseguro)

public class Singleton {

    private static Singleton singleton;

    public Singleton() {
    }

    public static Singleton getInstance() {
        if (singleton == null) {
            singleton = new Singleton();
        }
        return singleton;
    }

}
  • 1. El modo de hombre perezoso declara un objeto estático, que se inicializa cuando el usuario lo llama por primera vez. Por un lado, ahorra recursos, pero por otro lado, debe crearse una instancia cuando se carga por primera vez, la respuesta es un poco más lenta y no puede funcionar normalmente cuando hay varios subprocesos, y el subproceso no es seguro. .

(3) Modo perezoso (seguridad de subprocesos)

public class Singleton {

    private static Singleton singleton;

    public Singleton() {
    }

    public static synchronized Singleton getInstance() {
        if (singleton == null) {
            singleton = new Singleton();
        }
        return singleton;
    }

}
  • 1. Esta forma de escribir puede funcionar bien en subprocesos múltiples, pero debe sincronizarse cada vez que se llama al método getInstance. Esto causará una sobrecarga de sincronización innecesaria, y la mayoría de las veces no necesitamos sincronización. Por lo tanto, este modo no es recomendable.

(4) Modo de verificación doble (DCL)

public class Singleton {

    private volatile static Singleton singleton;

    public Singleton() {
    }

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

}
  • 1. Esta forma de escribir juzga si está vacío dos veces en getInstance. La primera vez es para una sincronización innecesaria, y la segunda vez es para crear una instancia cuando Singleton es igual a Null.
  • 2. El uso de volatile afectará más o menos el rendimiento, pero teniendo en cuenta la corrección, vale la pena sacrificar este rendimiento.
  • 3. La ventaja de DCL es que la tasa de utilización de recursos es alta. El objeto singleton se instancia cuando se ejecuta getInstance por primera vez, y la eficiencia es alta. La desventaja es que la respuesta es un poco más lenta al cargar por primera vez, y también tiene ciertos defectos en un entorno de alta concurrencia. Aunque DCL resuelve el consumo de recursos, la sincronización redundante, la seguridad de subprocesos y otros problemas hasta cierto punto, fallará en algunos casos. Se recomienda utilizar el modo singleton de clase interna estática en lugar de DCL.

(5) Modo singleton de clase interna estática

public class Singleton {

    private Singleton() {
    }

    public static Singleton getInstance() {
        return SingletonHolder.SINGLETON;
    }

    private static class SingletonHolder {
        private static final Singleton SINGLETON = new Singleton();
    }
}
  • 1. Cuando se carga por primera vez la clase Singleton, getInstance no se inicializará, solo cuando llamamos al método getInstance, la máquina virtual carga SingletonHolder e inicializa SINGLETON. No solo se puede garantizar la seguridad de subprocesos, sino que también se puede garantizar la singularidad de la clase Singleton.

(6) Enumerar singletons

    public enum Singleton{
        INSTANCE;
    }

2. Escenarios de uso del modo singleton

  • Todo el proyecto requiere un punto de acceso compartido o datos compartidos
  • Crear un objeto que te ame requiere demasiados recursos, como acceder a recursos como E/S o bases de datos.
  • Objeto de herramienta.

Supongo que te gusta

Origin blog.csdn.net/u013290250/article/details/82253611
Recomendado
Clasificación