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.
- 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());
}
}
- 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());
}
}
singleton
Objeto a utilizarvolatile
Modificación para evitar la reordenación
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.
.