Bom vamos usar aqui pra tirarmos as dúvidas sobre wait() e notify().
Aqui vão as minhas:
- O java tem só um monitor? Tipo se eu fizer wait() num thread (por exemplo trecho) e fizer o notify em outra (por exemplo estrada), eu vou liberar o trecho?
- Qdo eu faço notifyAll() eu envio um sinal pra tds as threads que estão esperando certo? Se por exemplo eu tenho 3 threads esperando numa barreira (criado com o wait() do monitor), dá pra liberar todas com notifyAll() ou só uma ira acordar e as outras vão continuar esperando um notify()?
Por enquanto acho que é só isso!!!
Em resposta à Bruno Vercelino da Hora
Re: Dúvidas sobre monitores em JAVA
por Alexandre Pitta Guedes -
1) Não. Não.
cada instancia de um objeto tem o seu monitor.
Po exemplo a classe Trecho tem um metodo:
synchronized colocaCarroNoTrecho(Carro c) {
while(!inicio_do_trecho_liberado_para_novo_carro){
wait();
}
}
Ai em sua classe principal, com o main() vc tem algo do tipo.
Trecho trecho1 = new Trecho();
Trecho trecho2 = new Trecho();
Trecho trecho3 = new Trecho();
...
Quando uma thread fizer wait dentro do trecho1, ela só poderá ser acordada por um notify OU notifyAll do trecho1.
2) Sim. Sim, todas são liberadas. Essa é a diferenca entre notify e notifyAll. Qdo vc faz notify, vc acorda a primeira thread esperando no wait daquele monitor. Qdo vc faz notifyAll, vc acorda todas as threads esperando no wait (daquele monitor).
cada instancia de um objeto tem o seu monitor.
Po exemplo a classe Trecho tem um metodo:
synchronized colocaCarroNoTrecho(Carro c) {
while(!inicio_do_trecho_liberado_para_novo_carro){
wait();
}
}
Ai em sua classe principal, com o main() vc tem algo do tipo.
Trecho trecho1 = new Trecho();
Trecho trecho2 = new Trecho();
Trecho trecho3 = new Trecho();
...
Quando uma thread fizer wait dentro do trecho1, ela só poderá ser acordada por um notify OU notifyAll do trecho1.
2) Sim. Sim, todas são liberadas. Essa é a diferenca entre notify e notifyAll. Qdo vc faz notify, vc acorda a primeira thread esperando no wait daquele monitor. Qdo vc faz notifyAll, vc acorda todas as threads esperando no wait (daquele monitor).
Em resposta à Alexandre Pitta Guedes
Re: Dúvidas sobre monitores em JAVA
por Bruno Vercelino da Hora -
Ok, vlw pela ajuda!
Agora mais uma:
O monitor tem uma espécie de fila, ou ele acorda um cara com wait() aleatoriamente?
Tipo se eu fizer wait() do carro no monitor, enquanto ele estiver andando no trecho. E isso ocorrer para vários carros. Qdo eu der notify pq o cara acabou o trecho eu acordo o primeiro ou é aleatório?
Agora mais uma:
O monitor tem uma espécie de fila, ou ele acorda um cara com wait() aleatoriamente?
Tipo se eu fizer wait() do carro no monitor, enquanto ele estiver andando no trecho. E isso ocorrer para vários carros. Qdo eu der notify pq o cara acabou o trecho eu acordo o primeiro ou é aleatório?
os monitores respeitam a ordem nos notifys. Mas, nada garante que ao ser
acordada uma thread consiga acesso imediato ao monitor (outra thread pode
entrar antes).
acordada uma thread consiga acesso imediato ao monitor (outra thread pode
entrar antes).
Segundo a documentação do Java 6 a thread acordada por um notify é escolhida arbitrariamente segundo implementação do java que você está usando, nenhuma garantia é dada se os notifys respeitam uma fila, mas é provável que isso ocorra, pelo menos no java da Sun
http://java.sun.com/javase/6/docs/api/java/lang/Object.html#notify()
http://java.sun.com/javase/6/docs/api/java/lang/Object.html#notify()