Qdo usar synchronized?

ae pessoal,
to com uma duvida bem basica aqui. eu queria saber qdo devo usar o synchronized. eu sei q devo usar qdo varias Threads acessam um mesmo objeto e tal.
mas e qdo eu tenho mehtodos estaticos de classes sendo acessado por varias threads? devo usar synchronized?

valeu! :wink:

Depende… se vc somente for ler os dados, nao precisa sincronizar

Rafael

os “dados” seriam os atributos da classe em questão … certo?
as variaveis locais de cada mehtodo estatico nao sao compartilhadas entre as threads?

esta era minha duvida.

se uma thread esta executando um mehtodo estatico (nao sincronizado) e outra thread comeca a executar ele, nao teria problema de consistencia de dados? mesmo se for soh para ler os atributos… eh q as variaveis locais do mehtodo podem ser modificadas …

valeu!

Nao faz diferenca se o metodo / membro / instancia eh static ou nao, o thread vai atuar da mesma forma.

O comportamento depende do que vc faz no teu metodo. Se voce soh ler dados, nao vai ter problema. Agora, digamos que voce tenha um ArrayList. Se, enquanto vc estiver lendo, uma outra parte do codigo ir la e modificar a lista, vc vai ter problemas. Ou seja, se vc chama o metodo sincronizado listaTudo(), nenhuma outra thread vai poder chamar o mesmo metodo enquanto a outra chamada nao terminar. Porem, nada impede de uma outra thread chamar o metodo removeTudo() enquanto o listaTudo() esta em execucao, ja que sao coisas diferentes.
Nesse caso, vc deveria sincronizar a lista, e nao o metodo ( ou ambos ).

Claro que ha varias maneiras de resolver o problema, como fazer uma copia da lista antes de comecar a processar ela para ler, mas mesmo assim nao da para garantir 100%, se vc nao sincronizar a copia.

Eh mto relativo do que vc for fazer… Se vc estiver em um metodo sincronizado e outra thread alterar algum dos valores que vc usa no metodo ( como um membro qq da classe ), vc podera ter resultados inesperados, ja que qdo vc entra no metodo “x” eh igual a 100, mas no meio da execucao, vem outro carinha e muda para “x” para 200…
Isso vc resolveria sincronizando a instancia toda do objeto.
Mais uma vez, depende mto do q vc tem e do q precisa.

Rafael

blza valeu!