Sobes.tech
Junior — Middle

Qual é a diferença entre um semáforo e um monitor no contexto de mecanismos de sincronização de threads?

sobes.tech IA

Resposta da IA

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

  • Семафор — это низкоуровневый примитив, который управляет счетчиком разрешений. Поток пытается захватить разрешение (операция 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(); // освободить разрешение