Sobes.tech
Middle
254

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
    }
}