Dúvidas sobre monitores em JAVA

Dúvidas sobre monitores em JAVA

by Bruno Vercelino da Hora -
Number of replies: 4
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!!!
In reply to Bruno Vercelino da Hora

Re: Dúvidas sobre monitores em JAVA

by 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).


In reply to Alexandre Pitta Guedes

Re: Dúvidas sobre monitores em JAVA

by 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?
In reply to Bruno Vercelino da Hora

Re: Dúvidas sobre monitores em JAVA

by Alfredo Goldman -
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).