Tenho 8 threads da mesma classe executando simultaneamete. Onde cada thread chama uma classe utilitária que realiza parses, Data para string, List para string etc…
Até aí tudo bem, porém ao aumentar o número de threads para 10, ocorre umas mensagens na execução da classe utilitaria, ela reclama de multiple points e NumberFormatException . Eu somente estou conseguindo evitar esta mensagem se coloco synchronized nos métodos de parse, porém desta forma eu perco a vantagem de utilizar thread.
Alguém tem uma sugestão do que posso estar fazendo ? Imagino que a execução esteja se perdendo no conteúdo da variável que vai para o parse, porém se eu uso um system.out, o valor está correto, e em modo de debug não tenho erro.
[quote=ViniGodoy]Crie objetos distintos dessa classe utilitária. E faça cada thread usar um objeto.
Se essa classe só tem métodos static, aí ferrou.[/quote]
acho que o problema está por aí mesmo… todos os métodos são static
Só para constar, você pode dispensar sincronização quando:
a. O método que você está chamando é imutável (por exemplo, ele só imprime dados);
b. O método que você está chamando só possui variáveis locais e não faz acesso a coisas static;
c. O objeto que possui o método é utilizado somente por uma única thread.
Quando duas ou mais threads acessam métodos que compartilham memória (ou seja, usam uma mesma propriedade de um único objeto), você precisa sincronizar, obrigatoriamente. Note que isso vale mesmo que uma thread só acesse um método A, e outra thread só o método B. Se ambos pertencem ao mesmo objeto, e compartilham um mesmo atributo, deve ter sincronização. E note também que estou falando de duas threads compartilhando o mesmo objeto, não a mesma classe.
[quote=kozak][quote=ViniGodoy]Crie objetos distintos dessa classe utilitária. E faça cada thread usar um objeto.
Se essa classe só tem métodos static, aí ferrou.[/quote]
acho que o problema está por aí mesmo… todos os métodos são static
[/quote]
Nesse caso, sincronize tudo. Ainda assim, haverá ganho em todos os pontos onde não existe chamada a esses métodos.
Ou refatore seu código para que os métodos deixem de ser static, ou atendam a uma das 3 condições acima.
Removi as declarações static dos métodos, e alterei as chamadas. Estou fazendo uma bateria de testes cheguei a 50 threads e até agora nenhum problema.
Muito obrigado novamente