Factory, Singleton e ThreadLocal

3 respostas
D

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:
/*
 * 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;
    }
  
}

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.

3 Respostas

Mauricio_Linhares

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.

D

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?

Mauricio_Linhares

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

Criado 22 de junho de 2005
Ultima resposta 22 de jun. de 2005
Respostas 3
Participantes 2