Нужно ограничить число одновременных обращений к внешнему API десятью, не ограничивая при этом число рабочих потоков. Какой примитив подходит?
Semaphore с десятью разрешениями: acquire перед вызовом, release в finally. Он ограничивает число одновременных доступов к ресурсу, не трогая число потоков.
- Не реентерабелен и не привязан к потоку: release может вызвать другой поток
- tryAcquire с таймаутом — не ждать вечно
- Справедливый режим — без голодания, но медленнее
А ещё В распределённой системе нужен общий лимит — Redis, rate limiter
Подробно
Семафор держит счётчик разрешений: acquire занимает разрешение или ждёт, release возвращает. Защёлка решает другую задачу — дождаться завершения N событий, и она одноразовая. Барьер синхронизирует группу потоков в общей точке и переиспользуем. Практические детали семафора, которые ценят: он не реентрантен (повторный acquire тем же потоком займёт второе разрешение и может привести к самоблокировке), а release не обязан следовать за acquire того же потока — этим пользуются, но так же легко и раздают лишние разрешения. Освобождать разрешение нужно в finally.
Что хотят услышать
- Выбор семафора и почему не latch и barrier.
- Освобождение в finally и tryAcquire.
Частые ошибки
- Путать Semaphore с ReentrantLock: у семафора нет владельца.
- Забыть release в finally и медленно исчерпать разрешения.
Проверьте себя
Один верный вариант. Подумайте, потом откройте ответ.
Показать варианты и ответ
- ✓Semaphore с десятью разрешениями
- ✗CountDownLatch со счётчиком 10
- ✗CyclicBarrier на 10 участников
- ✗ReentrantLock с десятикратным захватом
Что спросят дальше
- Чем CountDownLatch отличается от CyclicBarrier?
- Что делает справедливый (fair) режим семафора?
Разбор темы
- Координация: семафоры, защёлки и барьеры
Semaphore, CountDownLatch, CyclicBarrier, Phaser и Exchanger — что каждый делает и когда выбирать.
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.