Factory, Singleton e ThreadLocal

Olá, Pessoal!

Estou usando um framework que através de uma classe FactoryHelper e arquivos de configuração, obtêm-se um ObjectFactory que é quem cria os meus Object’s.

Como custa muito instanciar um ObjectFactory, e não é necessário mais de 1 instância dele para a aplicação, estava analisando a possibilidade de utilizar Singleton, mas recentemente vi muitas discursões sobre ThreadLocal (que já consultei a API).

Pesquisando códigos e práticas entrei (vários) códigos muito similares ao abaixo:

[code] /*

  • Assistente.java
    */
    package teste;

public class Assistente
{
private static final ThreadLocal objetoFactory = new ThreadLocal();

public static Object getObject()
{
    ObjectFactory factory = ((ObjectFactory) objetoFactory.get());
    if (factory == null)                // --> 1
    {
        factory = getObjectFactory();  // --> 2
        objetoFactory.set(factory);    // --> 3
    }
    
    return factory.createObject();
}

private static ObjectFactory getObjectFactory()
{
    ObjectFactory objectFactory = null;
    try
    {
        objectFactory = FactoryHelper.getObjectFactory("config.xml");
    }
    catch (java.io.IOException ioe)
    {
        ioe.printStackTrace();
    }
    return objectFactory;
}

}[/code]

O método getObject() será chamado concorrentemente. Uma dúvida sobre esse código refere-se mais é que ao testar a referência nula em (1), despender um bom tempo em (2), até atribuir a instância de ObjectFactory (3), sem fazer uso de blocos synchronized; não garante que só 1 instancia de ObjectFactory seja criada, certo?

Nesse padrão, que maneira seria aconselhável para manter essa única instância de ObjectFactory.

Se o que você precisa é um singleton, não deveria estar utilizando ThreadLocal, inicialize o seu singleton dentro de um bloco de inicialização estático que só vai haver uma instância da classe nesse classloader.

Entendo. E assim foi feito antes mesmo.
Parecido com:

Estou pensando em formas de contornar erros de inicialização durante o class loading, permitindo que ObjectFactory ainda seja instanciado caso a referência seja nula durante a chamada de Assistente.getObject().

E por acaso (apenas pensando) seria possível interromper o carregamento de uma classe, no seu próprio bloco static? Lançando exceções?

Não, exceções não, mas se você lançar um Error, a JVM morre, talvez resolva o problema:

http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Error.html