Categorías
Otros

Patrón de diseño-patrón singleton

Introducción

Asegúrese de que solo hay una instancia de una clase, crear una instancia de ella misma y proporcionar esta instancia al sistema

El método de construcción no puede ser público
Esta instancia es una variable miembro de clase de la clase actual

Lograr

De acuerdo con el tiempo de creación de instancias, se puede dividir en estilo hambriento y estilo perezoso.

  1. Estilo chino hambriento: crea una instancia cuando se carga la clase
public class Singleton {
    private Singleton(){}
    private static Singleton singleton = new Singleton();  //Hungry Chinese

    public synchronized static Singleton getInstance(){
        return singleton;
    }


    public static void main(String[] args) {
    	System.out.println(Singleton.getInstance());
        System.out.println(Singleton.getInstance());
    }
}
  1. Estilo perezoso: no cree una instancia cuando se cargue la clase, sino que la crea una instancia cuando se utilice por primera vez. Preste atención a la seguridad de los hilos.
public class Singleton {
    private Singleton(){}
    private static Singleton singleton;

    public synchronized static Singleton getInstance(){ //Thread safe
        if(singleton == null){    //Determine whether to instantiate
            singleton = new Singleton();
        }
        return singleton;
    }


    public static void main(String[] args) {
        System.out.println(Singleton.getInstance());
        System.out.println(Singleton.getInstance());
    }
}

Usamos bloqueo de subprocesos para bloquear todo el método de esta manera afectará al rendimiento, porque nuestro propósito es crear instancias del códigonew Singleton();Sólo ejecútelo una vez. Después de crear instancias una vez, no habrá más creación de instancias, pero en este momento se ejecutará el método de sincronización, lo que afecta al rendimiento, por lo que usamosFragmento de código de sincronizaciónPara garantizar la seguridad de la rosca y mejorar la velocidad de retorno. A saber: doble bloqueo de comprobación.

public class Singleton {
    private Singleton(){}
    private volatile static Singleton singleton;  //******

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


    public static void main(String[] args) {
        System.out.println(Singleton.getInstance());
        System.out.println(Singleton.getInstance());
    }
}

singletonObjeto a utilizarvolatileModificación para evitar la reordenación

  Último código fuente de versión de análisis de negocio de nombre de dominio secundario completo código abierto

Excepción

2 situaciones en las que se generan varias instancias
Hay varias máquinas virtuales Java en un sistema distribuido y cada máquina virtual tiene una instancia.
Se utilizan varios cargadores de clases en la misma máquina virtual para generar varias instancias.

Además, el modo singleton es generalmente apátrida y se proporciona en forma de herramientas.

.

Por Programación.Click

Más de 20 años programando en diferentes lenguajes de programación. Apasionado del code clean y el terminar lo que se empieza. ¿Programamos de verdad?

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *