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