Qual é a diferença entre os métodos notify() e notifyAll() em Java?
Resposta da IA
sobes.tech IA
A diferença é que notify() "acorda" apenas um thread, escolhido aleatoriamente, entre os que estão à espera no monitor do objeto, enquanto que notifyAll() "acorda" todos os threads à espera nesse monitor.
-
notify(): Usado quando tem a certeza de que apenas um dos threads à espera poderá realizar um trabalho útil após receber a notificação. Isto pode ser mais eficiente, pois evita acordar desnecessariamente outros threads e fazer mudanças de contexto. -
notifyAll(): Usado quando não tem a certeza de qual thread deve receber a notificação, ou quando vários threads podem beneficiar da mesma. Por exemplo, ao trabalhar com pools de recursos ou em modelos produtor-consumidor, onde vários consumidores podem estar prontos para processar um novo elemento.
Após o despertar, os threads competem para adquirir novamente o monitor. Apenas o thread que conseguir adquiri-lo pode continuar a execução. Os outros threads despertados voltarão ao estado de espera até poderem adquirir o monitor.
class SharedResource {
private boolean conditionMet = false;
public synchronized void waitForCondition() throws InterruptedException {
while (!conditionMet) { // Usa um ciclo while, não if, para proteção contra "falsos" despertamentos
wait(); // O thread liberta o monitor e passa ao estado de espera
}
// A condição foi satisfeita, o thread pode continuar
}
public synchronized void fulfillCondition() {
conditionMet = true;
// notify(); // Desperta um thread aleatório
notifyAll(); // Desperta todos os threads à espera
}
}