Ответ
Семафор — это механизм синхронизации, который ограничивает доступ к ресурсу. В отличие от мьютекса, семафор может разрешать доступ нескольким потокам одновременно.
Виды:
- Counting Semaphore — позволяет N потокам работать с ресурсом.
- Binary Semaphore (аналог мьютекса) — разрешает доступ только одному потоку.
Пример в Kotlin:
val semaphore = Semaphore(3) // Разрешает 3 потока одновременно
fun accessResource() {
semaphore.acquire() // Захватываем разрешение
try {
// Работа с ресурсом
} finally {
semaphore.release() // Освобождаем разрешение
}
}
Где использовать:
- Ограничение подключений к БД.
- Управление пулом потоков.
- Контроль доступа к API с лимитами.
⚠️ Важно избегать deadlock и правильно освобождать разрешения (release() в finally).
Ответ 18+ 🔞
Давай разберем, что за зверь такой — семафор. Представь, что у тебя есть один сортир на стройке, но в нём три кабинки. Мьютекс — это когда кабинка одна, и все стоят в одной очереди, ругаясь матом. А семафор — это вот эти три кабинки. Одновременно три потока... то есть три работяги могут справить нужду. Понял аналогию? Ёпта, гениально же.
Какие они бывают, эти семафоры:
- Считающий (Counting Semaphore) — это как раз наш сортир на три кабинки. Пускает N потоков одновременно, и всё.
- Бинарный (Binary Semaphore) — а это уже классика, одна кабинка. По сути, тот же мьютекс, но с другим подходом к жизни. Хуй с горы, если честно, обычно мьютекс и используют.
Смотри, как в Kotlin это выглядит, там всё просто:
val semaphore = Semaphore(3) // Вот тут говорим — пускай трое одновременно, не больше
fun accessResource() {
semaphore.acquire() // Пытаемся занять кабинку. Если все заняты — тут будешь стоять, бля, ждать
try {
// А вот тут уже делаешь свои делишки, работаешь с ресурсом
} finally {
semaphore.release() // ОБЯЗАТЕЛЬНО, сука, выпускай кабинку! В блок finally, чтобы даже если ошибка — всё освободилось
}
}
Где эту хрень применять?
- Ну, например, у тебя база данных, которая больше 10 подключений одновременно не тянет. Вот и выставляешь семафор на 10 — и спишь спокойно.
- Или лимиты какого-нибудь API, который орет, если больше 5 запросов в секунду. Семафор в помощь.
- Да хоть пул потоков свой костылить.
⚠️ Важный момент, бля! Главное — не забудь release() вызвать, а то будет deadlock, и все потоки повиснут, как будто в той самой кабинке кто-то уснул. Все будут ждать, а выходить-то некому. Терпения ноль ебать! И да, делай это в finally, это святое правило, чувак. Иначе при любом пиздеце (ошибке) в коде — твой семафор накроется медным тазом, и разрешение никогда не освободится.