Этот вопрос проверяет понимание механизма межпоточного взаимодействия через методы wait(), notify(), и notifyAll().
wait() — освобождает монитор объекта и переводит поток в режим ожидания.
notify() — пробуждает один случайный поток, ожидающий на этом мониторе.
notifyAll() — пробуждает все потоки, ожидающие на мониторе.
1. Основные принципы:
Все три метода вызываются только внутри synchronized-блока, иначе IllegalMonitorStateException.
Работают только с общим объектом-монитором.
2. Пример использования:
private val lock = Object()
fun producer() {
synchronized(lock) {
while (data.isEmpty()) {
lock.wait() // Ожидание данных
}
println("Данные получены: ${data.poll()}")
}
}
fun consumer() {
synchronized(lock) {
data.add("New Data")
lock.notify() // Пробуждение одного потока
// lock.notifyAll() — для пробуждения всех
}
} 3. Разница между notify() и notifyAll():
notify() — эффективнее, но может привести к голоданию потока.
notifyAll() — гарантирует пробуждение всех, но требует проверки условия после wait().
Вывод:
Используйте эту связку для координации потоков, но в современных приложениях предпочтительны ReentrantLock и Condition.