O padrão de singleton é um padrão de criação de objetos que garante que exista apenas uma instância de uma classe no sistema.
Na língua Java, há dois benefícios em fazer isso:
1. Para objetos usados frequentemente, o tempo gasto na criação de objetos pode ser omitido;
2. Devido à diminuição do número de novas operações, a frequência do uso da memória do sistema é reduzida, o que reduz a pressão do GC e reduz o tempo para a pausa do GC.
Segmentação de padrões de singleton:
1.
classe pública Singleton {private singleton () {System.out.println ("singleton.singleton ()"); } private estático singleton singleton = new singleton (); public static singleton getInstance () {return singleton; }}Nota: Primeiro, a classe Singleton deve ter um construtor de nível de acesso privado para garantir que o singleton não seja instanciado por outro código do sistema; Segundo, a variável de membro singleton e o método getInstance () devem ser estáticos.
Esta classe Singleton é muito simples de criar e é muito confiável. A única desvantagem é que Singleton não pode ser carregado com latência. Por exemplo, como o processo de criação de singleton é muito lento e a variável de membro é definida como estática, quando a JVM carrega a classe Singleton, o objeto Singleton também será criado. Em seguida, um objeto Singleton será criado em qualquer lugar em que uma classe singleton seja usada, independentemente de o objeto Singleton ser usado. Por exemplo:
classe pública Singleton {private singleton () {System.out.println ("singleton.singleton ()"); } private estático singleton singleton = new singleton (); public static singleton getInstance () {return singleton; } public static void CreateString () {System.out.println ("singleton.createstring ()"); }} 2. Para melhorar a velocidade de chamada das funções relacionadas, é necessário introduzir um mecanismo de carregamento preguiçoso.
pacote com.luchao.singtonle; classe pública lazysingleton {private lazysingleton () {system.out.println ("lazysingleton.lazysingleton ()"); } private estático lazysingleton lazyInstance = null; public sincronizado estático lazysingleton getInstance () {if (lazyInstance == null) lazyInstance = new lazysingleton (); Retornar LazyInstance; }}A atribuição de inicialização da variável estática é nula, garantindo que não haja carga adicional quando o sistema iniciar. No método getInstance (), é determinado que a instância atual já existe. Se existir, retorna. Se não existir, um singleton será criado. getInstance () deve ser um método síncrono, porque em um ambiente multithread, quando o Thread 1 está construindo um singleton e antes da conclusão da tarefa, o Thread 2 pode determinar que a instância é nula, portanto, o thread 2 iniciará o programa para criar um novo singleton, resultando em vários singletons que estão sendo criados.
O exemplo acima, a implementação de singleton implementa o carregamento atrasado, mas apresenta um método de sincronização, que leva muito mais tempo do que o primeiro programa Singleton em um ambiente com vários threads.
3. O padrão de singleton usa classes internas para manter a criação de singletons
classe pública STATICSINGLETON {private STATICSINGLETON () {System.out.println ("STATICSINGLETON.STICICSINGLETON ()"); } classe estática privada SingleToholder {private Static STATICSingleton ataticsingleton = new STATICSINGLETON (); } public static sticticingleton getInstance () {return singletonholder.ataticsingleton; }}Quando o STATICSINGLETON for carregado, a classe interna não será instanciada, garantindo que a classe Singleton não seja inicializada quando a classe STATICSINGLETON for carregada na JVM, e o singletoneholder for carregado quando o método getInstance () for chamado, inicializando a instância. Também é usado para criar casos em que a classe é carregada, por isso é naturalmente amigável.
O uso de classes internas para concluir o modo de lucro único pode não apenas obter carregamento tardio, mas também usar palavras-chave síncronas. É uma abordagem relativamente completa.
O exposto acima é todo o conteúdo deste artigo. Espero que seja útil para o aprendizado de todos.