O livro de Padrões de Projeto - Use a Cabeça - nos ensina a usar pelo menos duas implementações de singleton.
public class Singleton
{
private static Singleton singleton;
private Singleton(){}
public synchronized Singleton getInstance()
{
if(singleton == null)
singleton = new Singleton();
return singleton;
}
}
Essa primeira implementação utiliza um método sincronizado. O livro diz que sincronizar um método é caro (Isso é verdade, rsrs). Se várias threads estiverem sempre querendo adquirir uma referência ao objeto singleton, pode haver uma queda de desempenho, já que antes de entrar no método sincronizado, tem-se que obter o bloqueio.
A segunda implementação utiliza uma variável estática.
public class Singleton
{
private static Singleton singleton = new Singleton();
private Singleton(){}
public Singleton getInstance()
{
return singleton;
}
}
O livro não fala muita coisa a respeito desse segundo método. Ao meu ver, remove a obrigatoriedade de ter de obter o bloqueio do método. Quando a classe é carregada, um objeto singleton já é criado. Qualquer thread pode obter uma referência a esse objeto. Sempre irão obter uma referência ao mesmo objeto e entrar mais de uma thread no método getInstance não causa problema algum.
Assim, porque usaríamos o primeiro código em vez do segundo? Alguém poderia me fazer o favor de explicar mais pontos positivos e negativos do primeiro e segundo código?