Concept atrás de colocar os métodos wait (), notify () na classe Object [duplicate]

Esta pergunta já tem uma resposta aqui:

Como os métodos wait () e notify () podem ser chamados em objetos que não são thread 9 respostas

Estou tendo dificuldade para entender o conceito por trás da colocaçãowait() emObject classe. Para essas questões, considere sewait() enotifyAll() estão dentroThread classe

class Reader extends Thread {
    Calculator c;
    public Reader(Calculator calc) {
        c = calc;
    }

    public void run() {
        synchronized(c) {                              //line 9
        try {
            System.out.println("Waiting for calculation...");
            c.wait();
        } catch (InterruptedException e) {}
            System.out.println("Total is: " + c.total);
        }
    }

    public static void main(String [] args) {
        Calculator calculator = new Calculator();
        new Reader(calculator).start();
        new Reader(calculator).start();
        new Reader(calculator).start();
        calculator.start();
    }
}

class Calculator extends Thread {
    int total;
    public void run() {
        synchronized(this) {                     //Line 31
            for(int i=0;i<100;i++) {
                total += i;
            }
             notifyAll();
        }
    } 
}

Minha pergunta é: que diferença isso poderia ter feito? Na linha 9, estamos adquirindo o bloqueio no objeto c e, em seguida, realizando a espera que satisfaz a condição de espera de que precisamos adquirir o bloqueio no objeto antes de usar a espera e, portanto, é o caso de notifyAll adquirimos o bloqueio do objeto da Calculadora na linha 31 .

questionAnswers(11)

yourAnswerToTheQuestion