Singleton ? Static ? ou o que?

7 respostas
M

Tenho uma aplicação desktop multihread para realizar uma tarefa que envolve conexões web, processamento de dados, etc

Para uma melhor manutenção do projeto, estou modularizando as tarefas em várias classes. O meu grande problema está no fato de saber o pattern mais adequado para o caso.

As threads precisam acessar os métodos presentes nas outras classes para cumprir sua tarefa. Segundo as minhas pesquisas, a operação mais custosa em Java seria realizar um NEW(), para evitar isso eu passei a utilizar o padrão Singleton, pois alguns objetos terão que ser construídos muitas vezes.

No entanto, tenho visto centenas de críticas ao padrão Singleton e o uso de métodos Static, qual seria a melhor opçãp para o desenvolvimento ? pelo menos uma opção que não sacrifique o uso de RAM ? uma coisa que não enyendi muito bem é pq estes estilos de programação são tão nocivos assim … será q alguém poderia me dar uma ideia ? exemplo ?

grato

7 Respostas

ViniGodoy

No caso de uma aplicação multi-thread, nenhum dos dois.

O que cria boa parte dos problemas do Singleton é justamente a presença de uma variável static.

Para que seu sistema tenha o máximo de paralelismo, é interessante pensar em como fazer com que threads sejam independentes em relação a memória. Statics e singletons vão contra esse princípio.

M

ainda esta complicado pra resolver, como as threads executam a mesma função, porém com um conjunto de dados diferente, acaba sendo necessário usar um tipo de sincronismo na aplicação, o que estou tentando evitar é um consumo elevado de RAM para que a maquina virtual não fique sem memória, ainda assim ? como Static interfere no paralelismo das threads ? existe algum controle interno de java sobre o acesso à métodos ou variáveis Static ?

ps = perdoe a ignorância :slight_smile:

ViniGodoy

Se você colocar synchronized sobre o static, isso vai fazer com que só uma thread acesse aquela região de memória por vez.

M

certo, isso eu entendi, o que não entendo é pq é ruim usar Singleton ? onde isso chega a ser tão nocivo ? o synchronized eu ainda consegui eliminar pq os dados processados pelas threads precisam ser armazenados em sistema de banco de dados

se eu tiver um singleton em uma classe sem métodos sincronizados, e cada thread acessar uma instancia dessa classe ? isso não seria algo bom ? eu permito que a função seja executada sem o uso excessivo de NEW

ViniGodoy

Se você tem um singleton, você tem uma instância só. Então, todas as threads acessarão o mesmo objeto, exatamente como ocorreria no static.

A única diferença entre um singleton e uma variável static pura é que no singleton você tem mais controle na hora da criação. No mais, os dois compartilham os mesmos problemas.

DavidUser

Independente da tecnologia utilizada, a nível de arquitetura uma área de memória só poder ser acessada por uma CPU em dado instante de tempo, para múltiplos acessos é necessário o uso de caches e manter o sincronismo dos mesmos; há muitas técnicas de sincronismo e tratamento de concorrência.

Esse parece ser um dos casos em que é necessário priorizar memória ou tempo de processamento. Em casos de grande exigência passa a ser viável o balanceamento de carga, levando ao uso de computação distribuída.

jcranky

Primeira coisa, porque você está tão preocupado com o uso de memória? Fez algum teste que te indique que esteja com algum problema com isso? E outra, o custo do new não vai ser tão significativo assim… a não ser que você esteja criando milhares de objetos, com uma frequência muito grande. É esse o caso?

Priorize sempre um bom design, e faça otimizações apenas se for realmente necessário.

Criado 2 de junho de 2013
Ultima resposta 3 de jun. de 2013
Respostas 7
Participantes 4