От Niko's java blogSynchronizing на объект Thread
Эти классы определены в одном файле. Каков результат? (1 правильный ответ)
class Job extends Thread {
private Integer number = 0;
public void run() {
for (int i = 1; i < 1000000; i++) {
number++;
}
}
public Integer getNumber() {
return number;
}
}
public class Test {
public static void main(String[] args)
throws InterruptedException {
Job thread = new Job();
thread.start();
synchronized (thread) {
thread.wait();
}
System.out.println(thread.getNumber());
}
}
- Он печатает 0.
- Он печатает 999999.
- Выход не гарантируется какой-либо из вышеперечисленного.
Выход 999999
. Я понимаю, что когда Thread завершает свой метод run()
, он завершается, и вместе с ним все блокировки Thread были освобождены. Однако в этом упражнении используется объект Thread как блокировка, не следует ли считать его нормальным объектом? Я имею в виду, что замок не принадлежит потоку thread
, а по главной теме.
Обратите внимание, что поток, возможно, завершился до того, как 'main' получает блокировку./Важно то, что вы используете частные объекты блокировки вместо того, чтобы делать подобные вещи. –
Да. И из-за ложных пробуждений вызов ожидания может вернуться до завершения задания, поэтому я бы проверил ответ: на выходе не гарантируется ни одно из вышеперечисленных. –
@JBNizet Однако метод join() не используется в фрагменте. Мы можем получить лишь некоторые теоретические выводы о том, что этот подход используется также, когда поток умирает? – Rollerball