2013-06-02 4 views
2

От 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, а по главной теме.

ответ

5

Этот код зависит от деталей реализации, которая не была документально до того Java 7, и теперь (в documentation of the join() method), но со следующими словами:

как нить завершает метод this.notifyAll является вызывается. Рекомендуется, чтобы приложения не использовали wait, notify или notifyAll для экземпляров Thread.

Поэтому я не знаю, где был задан этот вопрос, но он действительно проверяет, знаете ли вы скрытые угловые случаи потоковой передачи, которые вы никогда не должны использовать в какой-либо разумной программе.

+1

Обратите внимание, что поток, возможно, завершился до того, как 'main' получает блокировку./Важно то, что вы используете частные объекты блокировки вместо того, чтобы делать подобные вещи. –

+2

Да. И из-за ложных пробуждений вызов ожидания может вернуться до завершения задания, поэтому я бы проверил ответ: на выходе не гарантируется ни одно из вышеперечисленных. –

+0

@JBNizet Однако метод join() не используется в фрагменте. Мы можем получить лишь некоторые теоретические выводы о том, что этот подход используется также, когда поток умирает? – Rollerball

 Смежные вопросы

  • Нет связанных вопросов^_^