Вопрос проверяет понимание базовых механизмов синхронизации и взаимодействия потоков в Java.
wait() и notify() используются для координации работы потоков через общий объект. wait() переводит поток в состояние ожидания, освобождая монитор. notify() будит один из ожидающих потоков. Эти методы работают только в контексте синхронизации.
Для корректного взаимодействия потоков Java предоставляет механизм ожидания и оповещения.
Определение:wait() и notify() — это методы класса Object, предназначенные для взаимодействия потоков через монитор объекта.
Основная логика:
один поток ждет выполнения условия
другой поток изменяет состояние и уведомляет ожидающих
wait() используется, когда поток не может продолжать работу, пока не выполнится определенное условие.
Особенности:
поток освобождает монитор объекта
поток переходит в состояние ожидания
выполнение продолжается после уведомления
synchronized (lock) {
while (!condition) {
lock.wait();
}
// выполнение после уведомления
}
notify() используется для пробуждения одного ожидающего потока.
Особенности:
пробуждается случайный ожидающий поток
монитор не освобождается сразу
поток продолжит выполнение после выхода из synchronized-блока
synchronized (lock) {
condition = true;
lock.notify();
}
всегда использовать while, а не if
wait() и notify() работают только с монитором
возможны ложные пробуждения
wait() и notify() позволяют потокам координировать работу, но требуют строгого соблюдения правил синхронизации.