Получить доступ

Нужно ограничить число одновременных обращений к внешнему API десятью, не ограничивая при этом число рабочих потоков. Какой примитив подходит?

MiddleМногопоточность
Коротко

Semaphore с десятью разрешениями: acquire перед вызовом, release в finally. Он ограничивает число одновременных доступов к ресурсу, не трогая число потоков.

  • Не реентерабелен и не привязан к потоку: release может вызвать другой поток
  • tryAcquire с таймаутом — не ждать вечно
  • Справедливый режим — без голодания, но медленнее

А ещё В распределённой системе нужен общий лимит — Redis, rate limiter

Так подсказку видит пользователь sotto на живом собеседовании — за пару секунд, пока вы думаете вслух.

Подробно

Семафор держит счётчик разрешений: acquire занимает разрешение или ждёт, release возвращает. Защёлка решает другую задачу — дождаться завершения N событий, и она одноразовая. Барьер синхронизирует группу потоков в общей точке и переиспользуем. Практические детали семафора, которые ценят: он не реентрантен (повторный acquire тем же потоком займёт второе разрешение и может привести к самоблокировке), а release не обязан следовать за acquire того же потока — этим пользуются, но так же легко и раздают лишние разрешения. Освобождать разрешение нужно в finally.

Что хотят услышать

  • Выбор семафора и почему не latch и barrier.
  • Освобождение в finally и tryAcquire.

Частые ошибки

  • Путать Semaphore с ReentrantLock: у семафора нет владельца.
  • Забыть release в finally и медленно исчерпать разрешения.

Проверьте себя

Один верный вариант. Подумайте, потом откройте ответ.

Показать варианты и ответ
  • ✓Semaphore с десятью разрешениями
  • ✗CountDownLatch со счётчиком 10
  • ✗CyclicBarrier на 10 участников
  • ✗ReentrantLock с десятикратным захватом

Что спросят дальше

  • Чем CountDownLatch отличается от CyclicBarrier?
  • Что делает справедливый (fair) режим семафора?

Разбор темы

Связанные вопросы

Закрытая бета

Подсказки на собеседовании — в реальном времени

sotto слышит вопрос интервьюера и показывает короткий ответ и план, как в блоке «Коротко». Оставьте контакт — пришлём доступ и промокод.

  • Промокод на 2 часа — сверх пробных 30 минут
  • Программа для Windows — скачать сразу, войти — через Яндекс ID или VK ID
  • Прямая связь с разработчиком: что улучшить — сделаем