Singleton sem synchronized

2 respostas
J

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

2 Respostas

guilherme.chapiewski
J

Exatamente o que eu queria saber! Obrigado Guilherme!

abs,

José Roberto

Criado 21 de maio de 2007
Ultima resposta 21 de mai. de 2007
Respostas 2
Participantes 2