Singleton Pattern es un patrón de creación de objetos que asegura que solo haya una instancia de una clase en el sistema.
En el idioma Java, hay dos beneficios al hacer esto:
1. Para los objetos de uso frecuente, se puede omitir el tiempo dedicado a crear objetos;
2. Debido a la disminución en el número de nuevas operaciones, la frecuencia del uso de la memoria del sistema se reduce, lo que reduce la presión de GC y acorta el tiempo para la pausa de GC.
Segmentación de patrones singleton:
1.
public class Singleton {private Singleton () {System.out.println ("Singleton.singleton ()"); } private static singleton singleton = new Singleton (); public static singleton getInstance () {return Singleton; }}Nota: Primero, la clase Singleton debe tener un constructor de nivel de acceso privado para garantizar que el código del sistema no esté instanciado el singleton; En segundo lugar, el método Singleton Member Variable y GetInstance () debe ser estático.
Esta clase singleton es muy simple de crear y es muy confiable. La única desventaja es que Singleton no se puede cargar de forma latente. Por ejemplo, debido a que el proceso de creación de Singleton es muy lento y la variable miembro se define como estática, cuando JVM carga la clase Singleton, el objeto Singleton también se creará. Luego, se creará un objeto Singleton en cualquier lugar donde se use una clase Singleton, independientemente de si se usa el objeto Singleton. Por ejemplo:
public class Singleton {private Singleton () {System.out.println ("Singleton.singleton ()"); } private static singleton singleton = new Singleton (); public static singleton getInstance () {return Singleton; } public static void createString () {System.out.println ("Singleton.CreateString ()"); }} 2. Para mejorar la velocidad de llamada de las funciones relacionadas, se debe introducir un mecanismo de carga perezoso.
paquete com.luchao.singtonle; public class Lazysingleton {private LazySingleton () {System.out.println ("Lazysingleton.lazysingleton ()"); } private static Lazysingleton LazyInstance = null; Public sincronizado Lazysingleton getInStance () {if (LazyInstance == null) LazyInstance = new LazySingleton (); regresar perezoso; }}La asignación de inicialización de una sola variable estática es nula, asegurando que no haya una carga adicional cuando se inicia el sistema. En el método getInstance (), se determina que la instancia actual ya existe. Si existe, regresa. Si no existe, se crea un singleton. getInstance () debe ser un método sincrónico, porque en un entorno de múltiples subprocesos, cuando el subproceso 1 está construyendo un singleton y antes de que se complete la asignación, el hilo 2 puede determinar que la instancia es nula, por lo que Thread 2 iniciará el programa para crear un nuevo singleton, lo que resulta en que se creen múltiples singletons.
La implementación de Singleton de ejemplo anterior implementa la carga retrasada, pero introduce un método de sincronización, que lleva mucho más tiempo que el primer programa Singleton en un entorno múltiple.
3. Singleton Pattern utiliza clases internas para mantener la creación de singletons
Public Class STATICSINGLETON {private staticsingleton () {system.out.println ("staticsingleton.staticsingleton ()"); } Singletonholder de clase estática privada {STATIC STICICSINGELETONTONATONATONTOTON de privado Ataticsingleton = new StaticSingLeton (); } public static staticsingleton getInstance () {return singletonholder.ataticsingleton; }}Cuando Staticsingleton se carga, la clase interna no se instanciará, asegurando que la clase Singleton no se inicialice cuando la clase de estadicidad se cargue en JVM, y el SingletOnholder se carga cuando se llama al método getInStance (), inicializando así la instancia. También se usa para crear instancias cuando la clase está cargada, por lo que es naturalmente amigable con los subprocesos.
El uso de clases internas para completar el modo de fines de lucro único no solo puede lograr una carga retrasada, sino que también usa palabras clave síncronas. Es un enfoque relativamente completo.
Lo anterior es todo el contenido de este artículo. Espero que sea útil para el aprendizaje de todos.