1 Descripción general
El patrón singleton tiene varios beneficios:
(1) Ciertas clases se crean con más frecuencia. Para algunos objetos grandes, esto supone una gran sobrecarga para el sistema.
(2) Se omite el nuevo operador, lo que reduce la frecuencia de uso de la memoria del sistema y reduce la presión del GC.
(3) Algunas clases, como el motor comercial central de un intercambio, controlan el proceso de transacción. Si se pueden crear varias clases, el sistema estará completamente desordenado.
2 Explicación detallada
Hay dos formas comúnmente utilizadas de escribir el patrón singleton de la siguiente manera.
2.1 Estilo chino hambriento
Si la aplicación siempre crea y usa el patrón singleton, o si la presión de creación y tiempo de ejecución no es muy alta, puede usar una variable estática privada para crear el objeto por adelantado.
Copie el código de código de la siguiente manera:
paquete org.scott.singleton;
/**
* @autor Scott
* @versión 2013-11-16
* @descripción
*/
clase pública Singleton1 {
Singleton1 estático privado UniqueInstance = new Singleton1();
singleton1 privado(){
}
público estático Singleton1 getInstance(){
devolver instancia única;
}
}
En este caso, cuando la JVM cargue esta clase, el objeto habrá sido creado según la secuencia de inicialización. Al mismo tiempo, la JVM puede garantizar que cualquier subproceso debe crear esta instancia primero y solo una vez antes de acceder a este objeto singleton.
Por supuesto, también puedes usar una clase interna estática para realizar la misma función.
Copie el código de código de la siguiente manera:
paquete org.scott.singleton;
/**
* @autor Scott
* @versión 2013-11-16
* @descripción
*/
clase pública Singleton2 {
singleton2 privado() {
}
/**
* Aquí se utiliza una clase interna para mantener el singleton.
* */
clase estática privada SingletonFactory {
instancia privada estática Singleton2 = new Singleton2();
}
público estático Singleton2 getInstance() {
devolver SingletonFactory.instancia;
}
/**
* Si el objeto se utiliza para la serialización, se puede garantizar que el objeto seguirá siendo coherente antes y después de la serialización.
* */
Objeto público readResolve() {
devolver getInstancia();
}
}
2.2 Método de doble bloqueo
"Doble bloqueo", como su nombre indica, son dos bloqueos. El primer bloqueo se utiliza para comprobar si el objeto de instancia que se va a crear se ha creado. Si no se ha creado, el segundo bloqueo se utiliza para la sincronización.
Copie el código de código de la siguiente manera:
paquete org.scott.singleton;
/**
* @autor Scott
* @versión 2013-11-16
* @descripción
*/
clase pública Singleton3 {
instancia única estática volátil privada Singleton3;
singleton3 privado(){
}
público estático Singleton3 getInstance(){
if(instancia única == nulo){
sincronizado (Singleton3.class) {
if(instancia única == nulo){
instancia única = new Singleton3();
}
}
}
devolver instancia única;
}
}
Si los requisitos de rendimiento son relativamente altos, este método puede reducir en gran medida el tiempo de creación. Actualmente, este método también es una forma relativamente común de crear singleton.