5. Как работают методы wait(), notify() и notifyAll()?

5. Как работают методы wait(), notify() и notifyAll()?

UNKNOWN

wait() 

  1. Поток входит в блок Synchronized.
  2. Объект-монитор - занят 
  3. Поток заблокировал монитор и не может работать дальше, т.к. каких-то данных еще не хватает – поток останавливается и ждет их, остальные потоки, которые ждут освобождения монитора, тоже ждут – очень дорого
  4. Поток ставиться на паузу методом wait() - освобождает монитор для других потоков

notify() (уведомить)

Методы notify/notifyAll можно вызвать у объекта-монитора и только, когда этот монитор занят – т.е. внутри блока synchronized.

Метод notifyAll снимает с паузы все потоки, которые стали на паузу с помощью данного объекта-монитора.

{

Висеть на методе wait() одного монитора могут сразу несколько потоков. При вызове notify() только один из них выходит из wait() и пытается захватить монитор, а затем продолжает работу со следующего после wait() оператора. Какой из них выйдет - заранее неизвестно.

А при вызове notifyAll(), все висящие на wait() потоки выходят из wait(), и все они пытаются захватить монитор.

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

Порядок очереди определяется планировщиком потоков Java.


Предыдущий вопрос: 4. Что такое синхронизация? Какие способы синхронизации существуют в java?

Следующий вопрос: 6. В каких состояниях может находиться поток?

Все вопросы по теме: список

Все темы: список

Вопросы/замечания/предложения/нашли ошибку: напишите мне

Report Page