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