Если два потока вызвали wait, какой из них будет пробуждён

«Если два потока вызвали wait, какой из них будет пробуждён» — вопрос из категории Многопоточность, который задают на 23% собеседований Android Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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

Если важно разбудить конкретный поток, можно использовать notifyAll(), который разбудит все ожидающие потоки, и они будут конкурировать за монитор (с учётом приоритетов и планировщика потоков).

Пример:

synchronized (lock) {
    lock.notify(); // случайный поток
    // или
    lock.notifyAll(); // все потоки
}