Вопрос проверяет понимание различий между двумя фундаментальными механизмами синхронизации в многопоточном программировании.
Монитор и семафор — это два разных подхода к синхронизации доступа к общим ресурсам в многопоточных средах. Монитор является более абстрактной и структурированной конструкцией, в то время как семафор представляет собой более примитивный и гибкий механизм.
Монитор — это конструкция языка программирования, которая объединяет данные и методы для работы с ними в единый блок, гарантируя, что только один поток может выполнять код внутри монитора в любой момент времени. Он автоматически управляет блокировками и предоставляет механизм условных переменных для ожидания и уведомления потоков.
Пример на Java (синхронизированный метод):
public class Counter {
private int count = 0;
public synchronized void increment() {
count++;
}
public synchronized int getCount() {
return count;
}
}Здесь ключевое слово synchronized автоматически создает монитор, гарантируя, что только один поток может выполнять increment() или getCount() одновременно.
Семафор — это более низкоуровневый механизм, который представляет собой целочисленный счетчик. Он поддерживает две атомарные операции: wait() (или acquire()), которая уменьшает счетчик, и signal() (или release()), которая увеличивает его. Если счетчик равен нулю, поток, вызывающий wait(), блокируется до тех пор, пока другой поток не вызовет signal().
Пример на C (с использованием pthreads):
#include <pthread.h>
#include <semaphore.h>
sem_t sem;
void* worker(void* arg) {
sem_wait(&sem); // Захват семафора
// Критическая секция
sem_post(&sem); // Освобождение семафора
return NULL;
}
int main() {
sem_init(&sem, 0, 1); // Инициализация семафора со значением 1
// Создание потоков...
}Здесь семафор инициализируется значением 1, что делает его бинарным семафором (аналогом мьютекса).
wait() и signal().signal()), семафор требует более тщательного программирования.Вывод: Монитор предпочтительнее для большинства задач синхронизации в высокоуровневых языках, так как он проще и безопаснее. Семафоры полезны для управления пулами ресурсов или в низкоуровневом программировании, где требуется максимальная гибкость.
Уровень
Рейтинг:
4
Сложность:
6
Навыки
JavaScript
Networks
Ключевые слова
Подпишись на Java Developer в телеграм