Этот вопрос проверяет понимание различий между низкоуровневой координацией потоков и более абстрактными механизмами синхронизации.
wait/notify — это низкоуровневый механизм координации потоков.synchronized сам по себе отвечает только за взаимное исключение.wait/notify позволяют потокам ожидать выполнения условий.
На более высоком уровне чаще используют Lock, Condition, Semaphore и другие абстракции.
Они проще в использовании и безопаснее.
Хотя wait/notify и synchronized часто используются вместе, они решают разные задачи.
synchronizedsynchronized отвечает только за:
Взаимное исключение.
Защиту критической секции.
Гарантии видимости памяти.
Пример:
synchronized (lock) {
// только один поток внутри
}
wait/notifywait/notify добавляют координацию потоков, а не просто блокировку.
Они позволяют:
Приостановить поток до наступления условия.
Освободить монитор на время ожидания.
Разбудить другие потоки по событию.
Использование wait/notify требует:
Циклов while для проверки условий.
Аккуратной работы с состоянием.
Понимания состояний потоков.
Ошибки приводят к:
потерянным уведомлениям
взаимным блокировкам
трудноотлавливаемым багам
На практике чаще применяют:
Lock и Condition
CountDownLatch
Semaphore
BlockingQueue
Пример с BlockingQueue:
queue.take(); // ожидание
queue.put(item); // уведомление
wait/notify — мощный, но сложный и опасный инструмент низкого уровня, тогда как высокоуровневые примитивы обеспечивают ту же функциональность проще и безопаснее.