Java: ожидайте (), уведомьте (), и синхронизировал блоки

Я изучил тот вызов Объекта wait() метод выпустит объектный монитор, если существующий.

Но у меня есть некоторые вопросы относительно вызова notify() на этом объекте другим потоком:

  1. (когда) поток ожидания проснется, если другой (3-е) поток будет владеть объектным монитором в это время?

  2. будет поток ожидания просыпаться, если 3-й названный поток wait() на этом объекте?

  3. действительно ли возможно определить, ожидает ли поток уведомления конкретного объекта (Java 1.4/java 5)

  4. Что происходит если wait() будет призван finalize() метод?

8
задан MRalwasser 16 July 2010 в 11:09
поделиться

4 ответа

  1. notify разбудит один поток, ожидающий на мониторе. Пока монитор не станет бесхозным, ни один ожидающий поток не сможет работать; wait() должен быть вызван в синхронизированном блоке, поэтому для продолжения работы этого блока необходимо удерживать блокировку.
  2. Никаких гарантий. Вызовите notifyAll, чтобы дать всем потокам шанс проснуться.
  3. Не знаю. Можно заставить поток установить переменную, говорящую, что он ждет, перед тем как заснуть...
  4. Возможно, это плохая идея. Вы можете придумать ситуацию, когда это необходимо?
2
ответ дан 5 December 2019 в 21:15
поделиться

Когда вы вызываете wait () из потока, этот поток прекращает выполнение и добавляется в набор ожидания объекта. Когда вы вызываете notify () из другого потока, пробуждается случайный поток из набора ожидания, если вы вызываете notifyAll (), все будет готово к выполнению.

Когда вы вызываете notify (), поток готов к запуску, но это не означает, что он будет выполнен немедленно, так что будьте осторожны.

  1. Это случайным образом будит поток из набора ожидания.

  2. Вы не знаете, какой из них проснется первым, он не подчиняется никакому приказу.

  3. Thread.getState ()

  4. Вы можете создать тупик.

3
ответ дан 5 December 2019 в 21:15
поделиться
  1. Вот почему у вас есть методы notify() и notifyAll(). Первый будит один поток, ожидающий объект, второй будит все потоки. Ожидающий поток не проснется, если wait() будет вызван в другом потоке.

  2. Нет.

  3. Можно только вызвать thread.holdsLock(obj), чтобы узнать, держит ли поток мониторную блокировку на конкретном объекте.

  4. Не вызывайте wait() в методе finalize.

2
ответ дан 5 December 2019 в 21:15
поделиться

2: Не обязательно. notify() пробуждает один из ожидающих потоков. Это может быть первоначальный или третий.

3: С помощью thread.getState() можно узнать, ожидает ли поток объект, но я не знаю, всегда ли можно узнать, какой именно это объект.

0
ответ дан 5 December 2019 в 21:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: