Забота о размещении методов 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 .