eduveks:
Só um conselho…
Não use muito o synchronized, apenas quando é realmente necessário, se não tu vai acabar causando problemas de concorrência e sincronização, travando as threads…
Foi um problema que já tive, e a solução foi tirar os diversos synchronized, q estavam sendo usados sem necessidade, problema resolvido.
Quem souber mais detalhes sobre esta caracteristica era bom q ajudasse a exclarecer.
Na verdade, o problema estava na sua aplicação e não nos blocos synchronized. É bem provável que você estivesse usando os blocos da maneira errada. A maior parte dos erros, para quem começa a mexer com threads, é usar synchronized demais sobre a mesma chave de sincronização (provavelmente this, que é a chave default).
Lembrando: Se um de seus blocos synchronized bloqueia a chave, nenhum outro bloco poderá ser acessado.
Muitas vezes, usar 2 chaves de sincronização resolveria o problema. Um caso de erro típico é deixar um bloco vigiando um InputStream de um socket e outro enviando dados pelo OutputStream. Enquanto o método read está travado no InputStream, o write não pode ser usado no OutputStream. E isso é um problema bem grande se o read só for desbloqueado em resposta a um comando do write…
Quando você removeu o synchronized, você realmente eliminou um problema: o deadlock. Entretanto, certamente criou outro problema, o de acesso concorrente. Sua aplicação pode ter poucas chances de cair em situações de concorrência que te causam dor de cabeça, e por isso a sensação do problema resolvido. Entretanto, se um belo dia o problema ocorrer, vai ser difícil de depurar e difícil de reproduzir. E vai ocorrer esporadicamente.
Uma das coisas ruins, na minha opinião, é que vende-se a idéia que lidar com múltiplas threads é um assunto trivial em Java. Embora a linguagem forneça mecanismos nativos e muito bons, e certamente seja mais fácil lidar do que no C++, lidar com múltiplas threads ainda é um assunto complicado e cheio de detalhes. O ideal é recorrer a API do java.util.concurrent sempre que possível e fazer threading no braço só quando não tiver outra maneira de resolver o problema.