Olá, estou fazendo uma aplicação que usa um Singleton para uma Facade e num determinado momento terei que “resetar” o singleton. Ou seja, recria-lo. Estou com uma tremenda duvida em como fazer isso. Estive pensando em fazer um metodo assim:
Entretanto, sei que esse metodo deve ser sincronizado com o getInstance tambem e é exatamente aí que estou com duvidas. Como posso fazer isso? Como resetar seguramente o singleton?
eh soh sincronizar usando o mesmo lock os dois trechos de codigo. como voce sugeriu! vaii funcionar belezinha. Eu tambem costumo deixar um reset em singletons do tipo POOL, caso eu queira modificar alguma variavel do tipo minObjetos ou maxObjetos.
public static synchronized void resetSingleton() {
fachadaSingleton = null;
}
quando o metodo eh estatico, ele sempre sincroniza pelo objeto que representa a classe naquele ClassLoader. Se for um metodo de instancia, ele sincroniza no this.
Obrigado pela resposta. Esclareceu grande parte das minha duvidas. Entretanto, ainda fiquei com uma. Na verdade nem sei se é duvida mesmo. Só quero me certificar de uma coisa.
Os metodos que uso para “gerenciar” o singleton são os seguintes:
public static Fachada getInstance() {
synchronized(Fachada.class) {
if(singletonFachada == null) {
singletonFachada = new Fachada();
}
}
// Ponto 1
return singletonFachada;
}
public static void resetSingleton() {
synchronized(Fachada.class) {
fachadaSingleton = null; // Ponto 2
}
}
Quero saber se corro o risco de, quando um usuario do singleton chegar ao “Ponto 1” do getInstance um outro usuario chegar imediatamente antes ao “Ponto 2” do resetSingleton e assim retornar um null. Sei que se eu sincronizar os metodos (ao inves dos blocos de codigo) terei garantias de que isso não acontecerá. Entretanto, temo que isso tenha impacto negativo na performance. O que vc me diz?
Assim voce evite if’s desnecessarios e nao precisa se preocupar com gerenciamento de acesso ao metodo. Utilizar dessa maneira tambem evita um outro problema ( o qual nao me lembro o nome agora, mas foi tratado um tempo atras aqui no forum ).
nao tera impacto de performance porque a maioria dos compiladores vai traduzir o codigo para a mesma coisa, se o método fosse inteiramente sincronizado (para ter certeza disso, precisa dar uma olhada na spec da JVM, mas estou quase certo de q a traducao para bytecode seria a mesma).
Fazendoe ssa sincronizacao a chance eh zero de duas threads diferentes chegarem uma ao ponto um e outra ao ponto 2, ja que o lock ja esta pego em algum dos pontos.
[quote=“J2Alex”][quote=“Rafael Steil”]Inicie a instancia no nomento da declaracao mesmo
[/quote]
Rafael, a questão é que, em determinado momento, ele pode precisar recriar o objeto - no caso de ter resetado o singleton.[/quote]
Exatamente isso… eu preferiria criar o singleton num bloco estatico mesmo para ele ser criado quando a classe for carregada. Só que como preciso reseta-lo… ficaria sem um metodo de recriação se fizesse isso. Bom, eu vou seguir o conselho do Paulo e sincronizar o metodo mesmo.
Mas nada impede de iniciar o objeto no momento da criacao dele e mesmo assim recriar o objeto posteriormente via qualquer outro metodo ( pelos metodos propostos nas mensagens anteriores )…
Meu… um singleton com várias instâncias não é singleton!!!
Não tem um jeito de você “resetar” a instância?? Não é mais produtivo?? Se vc quis singleton, é que era pra não ter duas… daí um cara vai lá e chama o getInstance(), depois alguém reseta, outro cara chama o getInstance() de novo, e se vc não tomar conta, vc pode ter dois caras achando que fão falando com a mesma instância e não estão…
Talvez vc esteja procurando um outro padrão… pool? factory?