Threads vs métodos sincronizados - questão de um simulado que eu não consigo entender a resposta

Olá !!!

Alguém poderia me ajudar explicando o código abaixo.

a thread “Main” excuta o seguinte trecho de código, “s.setPrice(200);”, não é verdade ??

Quando uma thread obtém o lock de um objeto significa que as outras threads não
poderão executar os outros métodos sincronizados daquele objeto ???

[code]
public class Master{

    boolean bContinue=false;  


    public static void main(String argv[]){  
       Master m = new Master();  
       m.go();  
    }  


    public void go(){  
         Slave s = new Slave(this);  
         Thread t1 = new Thread(s);  

         t1.start();  

         while(bContinue==false){}  

         s.setPrice(200);  
    }  

}

class Slave implements Runnable{

   int iPrice =100;  
   Master master;  


   Slave(Master m){  
        master=m;  
    }  


   synchronized public void setPrice(int iM){  
          iPrice=iM;     
   }  
 
   synchronized public void run(){  
          master.bContinue=true;  

          while(true){  
             System.out.println(iPrice);  
          }  
  
    }  

} [/code]

o resultado exibido é sempre “100”

até mais

Opssss falei besteira hehehe.

Na verdade a pegadinha é o método run() sobrescrito de forma errada. Ele não deve ter o synchronized. Se ele tiver o synchrnonized, quando o método for invocado é como se a thread não “executasse em paralelo”, ela fica preso dentro do loop infinito e não deixa com que a e execução da thread main prossiga. Tire o synchronized e teste novamente, você vai ver que o resultado vai mudar.

Até mais!

O problema está no synchronized do método run… quando entra no método run ele reserva o objeto Slave.
Quando o método setPrice é chamado ele tenta reservar o objeto Slave mas esse objeto ja está reservado quando entrou no método run, e como o metodo entra em loop e nunca larga o osso o resultado é que o método setPrice fica esperando para executar… e nunca executa :smiley:

lembre-se sempre que um método sincronizado reserva aquela instancia enquanto ele está sendo executado… e uma instancia soh poderá reservada uma vez… até que a reserva anterior seja destruida ninguem mais poderá reservar essa instancia…

" Quando o método setPrice é chamado ele tenta reservar o objeto Slave mas esse objeto ja está reservado quando entrou no método run"

Qual é a Thread que executa o método “setPrice” ??

Eu estou imaginando que é a Thread “Main”

A Thread “Main” tenta pegar o lock do objeto, mas este já foi pego pela thread “t1”

é isso mesmo ???

[quote=ffelipe] " Quando o método setPrice é chamado ele tenta reservar o objeto Slave mas esse objeto ja está reservado quando entrou no método run"

Qual é a Thread que executa o método “setPrice” ??

Eu estou imaginando que é a Thread “Main”

A Thread “Main” tenta pegar o lock do objeto, mas este já foi pego pela thread “t1”

é isso mesmo ??? [/quote]

É isso mesmo felipe!