Singleton: Inicialização tardia ou estática?

Olá pessoal,

Estava analisando algumas classes que utilizam singleton e são acessadas concorrentemente por várias Threads. O código está escrito seguindo o exemplo:
    
    ...

    private static MinhaClasse singleton;

    private MinhaClasse() {
        ...
    }

    public static synchronized MinhaClasse getInstance() {
        if (singleton = null) {
            singleton = new MinhaClasse();
        }
        return singleton;
    }

A aplicação irá rodar em um container web (Websphere) e cada aplicação está configurada para utilizar uma jvm exclusiva. Antes que alguém cite o fato de economia de memória, adianto que memória não é problema.

Gostaria de saber se há algum problema em fazer o seguinte:

    
    ...

    private static final MinhaClasse singleton;

    static {
        singleton = new MinhaClasse();
    }

    private MinhaClasse() {
        ...
    }

    public static MinhaClasse getInstance() {
        return singleton;
    }

Desde já agradeço…

Não há problemas, se o construtor de sua classe não depender de outras classes que talvez ainda não estejam inicializadas.

     static {
         singleton = new MinhaClasse();
     }

pode lançar um “java.lang.ExceptionInInitializerError” se houver alguma exception lançada pelo construtor de “MinhaClasse”. Isso pode ser um problema na hora de carregar sua aplicação.

Obrigado,

No caso a concorrência é bem grande, então sincronizar o método getInstance() pode causar uma demora desnecessária na minha opinião, já escrevendo com um inicializador estático dá para eliminar este problema...

Além da utilização de um inicializador estático existe alguma outra forma mais interessante de se fazer isto?