Caros,
Normalmente vejo implementações de singleton usando synchronized. Acontece que para mim, e certamente para muita gente, isso incomoda um pouco por sabermos que aquele método (ou bloco) sincronizado só será realmente útil na sua primeira utilização, pois nesta ocasião será criado a instância que ainda não existe e depois sempre a mesma instância será retornada, o que significa entrar no bloco synchronized atoa. Já ví discussões dizendo que é só colocar um “if” antes do bloco de sync, mas já li também que essa técnica chamada por aí de “double check” não é 100% garantida. Assim, enquanto estava eu aqui na minha rotina diária e precisei fazer um singleton, tive essa idéia de implementação e gostaria de saber a opinião de vocês quando à sua confiabilidade.
class OnlyOne {
private static final OnlyOne onlyOne = new OnlyOne();
private OnlyOne() {
.... inicializa levando o tempo que quiser
}
public static OnlyOne getIsntance() {
return onlyOne;
}
}
Eu suponho que isso esteja certo porque, pelo que sei, a JVM garante inicializar todas as variáveis estáticas apenas na primeira vez que se referencia uma classe; seja chamando um método estático, seja criando uma instância da classe. Será que se mais de uma thread chamar o getInstance() ao mesmo tempo a JVM pode inicializar duas vezes as variáveis estáticas? Alguma opinião? Obrigado.
abs,
José Roberto