A JVM deixa cada thread rodar um tempo e a paralisa para executar outra. Você não tem controle de que trecho será executado antes sem utilizar sincroninazação.
Ou seja: se você rpecisa obedecer a uma ordem de eventos deve continuar estudando para aprender a utilizar monitores, barreiras, wait/notify, etc.
bcartaxo
Não tem como vc prever a ordem de execução de threads, o máximo q vc pode fazer é sincronizar trechos de código para evitar corrupção de dados.
P
Pitagoras
Mas o método message é synchronized !!!
Ele ñ deveria ser executado somente por uma Thread de cada vez???
O método synchronized garante que duas threads não acessarão ao mesmo tempo o mesmo objeto. Quantas vezes você usa o new? duas. Então, você tem duas threads, acessando objetos diferentes. Como elas estão em blocos sincronizados de objetos diferentes, não há problema em que elas acessem esses blocos ao mesmo tempo. Tem mais detalhes no tópico que eu te passei.
Ainda sim, o seu exemplo é bastante infeliz. O bloco message é syncronized, mas o run não. Então, nada impede que, mesmo compartilhando o mesmo objeto, haja troca de threads entre as duas chamadas de message.
LPJava
cara isso é uma pegadinha, seus threads tem destino diferentes… observe que é criado um novo objeto em cada threads… e nao o mesmo destino que a thread anterior… a sincronização so afeta quando threads possui o mesmo destino… threads com destino diferentes… a sincronização nao bloqueia uma a outra. a kathy fala isso… dar uma lida bem devagar nessa parte das regras de threads… heheh
P
Pitagoras
Tá 1/2 complicado de entender !!!
:-?
LPJava
entao se liga nesse exemplo:
classSeligaimplements{publicvoidrun(){casco();}synchronizedvoidcasco(){System.out.println(Thread.currentThread().getName());}publicstaticvoidmain(Stringar[]){//aqui vc tem um new destino para esse objeto threadThreadt=newThread(newSeliga());//aqui eu tenhi outro objeto thread que tem outro objeto//com outro destinoThreadt2=newThread(newSeliga());//os objetos usados para destino sao novos objetos de destino//apesar de ser da mesma class, ambos nao bloqueia um ao outro//devido ser objetos diferentes.t.start();t2.start();
vc lembra que a kathy fala : “para ter um bloquei o destino deve ser o mesmo” entao objetos diferente nunca vai bloquear um ao outro… ja que ambos tem destino diferentes… viaje nisso agora: " vc e seu amigo vai vem para Bahia, um vem via mar e outro via terrestre… como um vai bloquear o outro se os caminhos eh diferentes, porem o destino é o mesmo" é ± isso que acontece… sacow… acho q viajei ai… mais… tentei explicar mais simples possivel…
obs.: synchronized so funciona quandos multiplos threads tem o mesmo destino.