В каком классе Java определен метод notify?

«В каком классе Java определен метод notify?» — вопрос из категории Java Core, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Метод notify() (а также notifyAll() и wait()) определен в классе java.lang.Object.

Назначение: Эти методы используются для координации потоков (inter-thread communication) и должны вызываться только внутри синхронизированного контекста, когда текущий поток владеет монитором объекта.

Правила использования:

  1. Синхронизация: Вызов notify() возможен только внутри блока или метода, синхронизированного на том же объекте (synchronized(obj)).
  2. Пробуждение: notify() пробуждает один произвольный поток, ожидающий на мониторе этого объекта (вызвавший obj.wait()). notifyAll() пробуждает все такие потоки.

Пример шаблона "Producer-Consumer":

public class SharedBuffer {
    private final Queue<String> queue = new LinkedList<>();
    private final int MAX_SIZE = 5;

    public synchronized void produce(String item) throws InterruptedException {
        while (queue.size() == MAX_SIZE) {
            wait(); // Освобождает монитор и ждет
        }
        queue.add(item);
        notifyAll(); // Пробуждает потребителей
    }

    public synchronized String consume() throws InterruptedException {
        while (queue.isEmpty()) {
            wait(); // Освобождает монитор и ждет
        }
        String item = queue.poll();
        notifyAll(); // Пробуждает производителей
        return item;
    }
}