Dúvidas sobre monitores em JAVA

Dúvidas sobre monitores em JAVA

por Bruno Vercelino da Hora -
Número de respostas: 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!!!
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).


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?
Em resposta à Bruno Vercelino da Hora

Re: Dúvidas sobre monitores em JAVA

por 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).
Em resposta à Alfredo Goldman

Re: Dúvidas sobre monitores em JAVA

por Fernando Raganhan -
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()