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.