Sobes.tech
Назад к вопросам
Junior — Middle
58

Какое отличие между семафором и монитором в контексте механизмов синхронизации потоков?

Компании, где спрашивали
Передовые Платежные Решения

Ответ от нейросети

sobes.tech AI

Семафор и монитор — это механизмы синхронизации потоков, но они отличаются по принципу работы и уровню абстракции.

  • Семафор — это низкоуровневый примитив, который управляет счетчиком разрешений. Поток пытается захватить разрешение (операция acquire), если разрешения закончились, поток блокируется. После завершения работы поток освобождает разрешение (release). Семафоры могут быть как бинарными (значение 0 или 1), так и с произвольным числом разрешений.

  • Монитор — это более высокий уровень абстракции, обычно реализуемый как объект с встроенной блокировкой и условными переменными. В Java монитором является любой объект, на котором можно синхронизироваться с помощью ключевого слова synchronized. Монитор обеспечивает взаимное исключение и возможность ожидания и уведомления потоков через методы wait(), notify(), notifyAll().

Ключевые отличия:

  • Семафор управляет числом разрешений, монитор — обеспечивает эксклюзивный доступ к ресурсу.
  • Монитор встроен в объектно-ориентированную модель Java, семафор — отдельный класс из java.util.concurrent.
  • Монитор поддерживает ожидание и уведомление потоков, семафор — только счетчик разрешений.

Пример использования монитора в Java:

synchronized (sharedObject) {
    while (!condition) {
        sharedObject.wait();
    }
    // критическая секция
    sharedObject.notifyAll();
}

Пример семафора:

Semaphore semaphore = new Semaphore(3); // 3 разрешения
semaphore.acquire(); // захватить разрешение
// работа с ресурсом
semaphore.release(); // освободить разрешение