Sobes.tech
Junior — Middle

Qual è la differenza tra un semaforo e un monitor nel contesto dei meccanismi di sincronizzazione dei thread?

sobes.tech AI

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