Assume the following method is properly synchronized and called from a thread A on an object B:
wait(2000);
After calling this method, when will the thread A become a candidate to get another turn at
the CPU?
A. After object B is notified, or after two seconds
B. After the lock on B is released, or after two seconds
C. Two seconds after object B is notified
D. Two seconds after lock B is released
A resposta é A a página é 776
Eu não entendi quem recebeu o bloqueio se foi A ou B!? Porque a questão é “when will the thread A become a candidate to get another turn at the CPU?” parece dizer que o wait partiu do objeto B e A foi blocked a espera de um notifyAll() ou os “2000” para pode ser candidata outra vez
mas a resposta indica que B que precisava ser notificada ou esperar pelos segundos!
Note que uma thread A inicia seu processamento e chama o método someMethod(). Isso faz com que ela a thread A chame sobre o objeto B o wait (como diz o enunciado) e durma.
Quando uma outra thread chamar o notify em b (num outro trecho com synchronized (b)) será A que irá acordar, pois A é quem dorme ali.
Não confunda a thread com o monitor. O monitor é o objeto que recebe as notificações e que controla o sleep. A thread é quem efetivamente percorre os métodos e é interrompida pelo processador. Objetos não sofrem bloqueios, eles apenas os controlam. Quem sofrem bloqueios são apenas threads.
luiz_renato
Vini ,
Sua explicação foi muito boa , me perdoa a pergunta besta mas no caso quem possui o bloqueio de quem quando uso um bloco synchonized?
Luiz Renato
evertonsilvagomesjav
luiz_renato:
Vini ,
Sua explicação foi muito boa , me perdoa a pergunta besta mas no caso quem possui o bloqueio de quem quando uso um bloco synchonized?
Luiz Renato
Um Thread possui o bloqueio do objeto usado no bloco sincronizado.
deyvid
Fale ViniGodoy, mas dua coisas estão me confundindo nessa questão
tá sendo chamado “wait(2000);” e não “b.wait(2000);”, é como se o próprio objeto da classe/Thread A estivesse chamando em algum momento
A resposta “After object B is notified, or after two seconds”, traduzindo fica “Depois que o objeto B é notificado, ou depois de dois segundos” e que me leva pensar que A tinha chamado o método wait(2000) e posto o B em estado de espera.
Quanto a sua explicação foi muito boa, mas minha dúvida passa ser semantica. Eu acho