Забота о размещении методов wait (), notify () в классе Object [duplicate]

На этот вопрос уже есть ответ:

Как можно вызывать методы wait () и notify () для объектов, которые не являются потоками? 9 ответов

Мне просто трудно понять концепцию, стоящую за положениемwait() вObject учебный класс. Ради этого вопроса рассмотрим, еслиwait() а такжеnotifyAll() находятся вThread учебный класс

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

Мой вопрос, что это могло изменить? В строке 9 мы получаем блокировку на объекте c, а затем выполняем ожидание, которое удовлетворяет условию ожидания, которое нам нужно, чтобы получить блокировку на объекте, прежде чем мы используем wait, и поэтому в случае notifyAll мы получили блокировку на объекте Calculator в строке 31 .

Ответы на вопрос(11)

Ваш ответ на вопрос