Dúvida sobre Thread!

Galera,

Olhem o seguinte código:

[code]class Ba implements Runnable{

	private String nome;
	
	public Ba(String nome){
		this.nome = nome;
	}

    public void run(){
    	message(1);
    	message(2);
    }
    private synchronized void message(int i){
    	
    	System.out.print("  "+nome + "-"+ i + " ");
    }

public static void main(String[] args) {
       new Thread(new Ba("Wallace")).start();
       new Thread(new Ba("Gromit")).start();

}

}[/code]

A dúvida é:

Por que a saída é:

Wallace-1 Gromit-1 Gromit-2 Wallace-2

A saída ñ deveria ser:

Wallace-1 Gromit-1 Wallace-2 Gromit-2

Se álguém achar a dúvida muito tosca, favor ñ respondam.

Falow!!

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.

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.

Mas o método message é synchronized !!!

Ele ñ deveria ser executado somente por uma Thread de cada vez???

Valew!! :?:

Esse problema já foi amplamente discutido nestes tópicos:
http://www.guj.com.br/posts/list/53105.java
http://www.guj.com.br/posts/list/57403.java#301703

Dê uma lida.

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.

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

Tá 1/2 complicado de entender !!!

 : - ?

entao se liga nesse exemplo:


class Seliga implements{
public void run(){
casco();
}
synchronized void casco(){
System.out.println(Thread.currentThread().getName());
}
public static void main(String ar[]){
//aqui vc tem um new destino para esse objeto thread
Thread t = new Thread(new  Seliga());
//aqui eu tenhi outro objeto thread que tem outro objeto
//com outro destino
Thread t2 = new Thread(new Seliga());
//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.

olha comilolopes essa explicação foi show…rsss