1 Visão Geral
O padrão singleton tem vários benefícios:
(1) Certas classes são criadas com mais frequência. Para alguns objetos grandes, isso representa uma enorme sobrecarga do sistema.
(2) O novo operador é omitido, o que reduz a frequência de uso da memória do sistema e reduz a pressão do GC.
(3) Algumas classes, como o mecanismo de negociação central de uma bolsa, controlam o processo de transação. Se várias classes puderem ser criadas, o sistema ficará completamente confuso.
2 Explicação detalhada
Existem duas maneiras comumente usadas de escrever o padrão singleton, como segue.
2.1 Estilo chinês faminto
Se o aplicativo sempre cria e usa o padrão singleton, ou se a pressão de criação e tempo de execução não é muito alta, você pode usar uma variável estática privada para criar o objeto antecipadamente.
Copie o código do código da seguinte forma:
pacoteorg.scott.singleton;
/**
* @autor Scott
* @versão 16/11/2013
* @descrição
*/
classe pública Singleton1 {
private static Singleton1 uniqueInstance = new Singleton1();
privado Singleton1(){
}
public static Singleton1 getInstance(){
return instância única;
}
}
Neste caso, quando a JVM carregar esta classe, o objeto terá sido criado de acordo com a sequência de inicialização. Ao mesmo tempo, a JVM pode garantir que qualquer thread deve criar esta instância primeiro e apenas uma vez antes de acessar este objeto singleton.
Claro, você também pode usar uma classe interna estática para realizar a mesma função.
Copie o código do código da seguinte forma:
pacoteorg.scott.singleton;
/**
* @autor Scott
* @versão 16/11/2013
* @descrição
*/
classe pública Singleton2 {
privadoSingleton2() {
}
/**
* Uma classe interna é usada aqui para manter o singleton
* */
classe estática privada SingletonFactory {
instância estática privada de Singleton2 = new Singleton2();
}
public static Singleton2 getInstance() {
retornar SingletonFactory.instance;
}
/**
* Se o objeto for usado para serialização, pode-se garantir que o objeto permaneça consistente antes e depois da serialização
* */
objeto público readResolve() {
return getInstance();
}
}
2.2 Método de bloqueio duplo
"Bloqueio duplo", como o nome sugere, são dois bloqueios. O primeiro bloqueio é usado para verificar se o objeto de instância a ser criado foi criado, o segundo bloqueio é usado para sincronização.
Copie o código do código da seguinte forma:
pacoteorg.scott.singleton;
/**
* @autor Scott
* @versão 16/11/2013
* @descrição
*/
classe pública Singleton3 {
privado volátil estático Singleton3 uniqueInstance;
Singleton3 privado(){
}
public static Singleton3 getInstance(){
if(uniqueInstance == null){
sincronizado(Singleton3.class){
if(uniqueInstance == null){
instância única = new Singleton3();
}
}
}
return instância única;
}
}
Se os requisitos de desempenho forem relativamente altos, este método pode reduzir bastante o tempo de criação. Atualmente, esse método também é uma forma relativamente comum de criar singletons.