Sobes.tech
Back to questions
Junior — Middle
57

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

Companies where asked
Передовые Платежные Решения

Answer from AI

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(); // освободить разрешение