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

4 respostas
ffelipe

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 ???

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);  
              }  
      
        }  
   }

o resultado exibido é sempre "100"

até mais

4 Respostas

davidbuzatto

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!

A

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…

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 ???

A

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 ???

É isso mesmo felipe!

Criado 22 de fevereiro de 2008
Ultima resposta 22 de fev. de 2008
Respostas 4
Participantes 3