Konzept hinter dem Setzen der Methoden wait (), notify () in der Objektklasse [duplicate]

Diese Frage hat hier bereits eine Antwort:

Wie können die Methoden wait () und notify () für Objekte aufgerufen werden, die keine Threads sind? 9 answers

Ich habe nur Schwierigkeiten, das Konzept hinter dem Putten zu verstehenwait() imObject Klasse. Bei diesen Fragen ist zu berücksichtigen, obwait() undnotifyAll() sind inThread Klasse.

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();
        }
    } 
}

Meine Frage ist, welchen Unterschied es hätte machen können? In Zeile 9 erfassen wir die Sperre für Objekt c und führen dann ein Warten durch, das die Bedingung für das Warten erfüllt, dass wir die Sperre für das Objekt erfassen müssen, bevor wir wait verwenden. Dies gilt auch für notifyAll, das wir in Zeile 31 für das Objekt Calculator erworben haben .