5. Как работают методы wait(), notify() и notifyAll()?
UNKNOWNwait()
- Поток входит в блок Synchronized.
- Объект-монитор - занят
- Поток заблокировал монитор и не может работать дальше, т.к. каких-то данных еще не хватает – поток останавливается и ждет их, остальные потоки, которые ждут освобождения монитора, тоже ждут – очень дорого
- Поток ставиться на паузу методом wait() - освобождает монитор для других потоков
notify() (уведомить)
Методы notify/notifyAll можно вызвать у объекта-монитора и только, когда этот монитор занят – т.е. внутри блока synchronized.
Метод notifyAll снимает с паузы все потоки, которые стали на паузу с помощью данного объекта-монитора.
{Висеть на методе wait() одного монитора могут сразу несколько потоков. При вызове notify() только один из них выходит из wait() и пытается захватить монитор, а затем продолжает работу со следующего после wait() оператора. Какой из них выйдет - заранее неизвестно.
А при вызове notifyAll(), все висящие на wait() потоки выходят из wait(), и все они пытаются захватить монитор.
Понятно, что в любой момент времени монитор может быть захвачен только одним потоком, а остальные ждут своей очереди.
Порядок очереди определяется планировщиком потоков Java.
Предыдущий вопрос: 4. Что такое синхронизация? Какие способы синхронизации существуют в java?
Следующий вопрос: 6. В каких состояниях может находиться поток?
Все вопросы по теме: список
Все темы: список
Вопросы/замечания/предложения/нашли ошибку: напишите мне