TGViewer
Java Portal | Программирование Java Portal | Программирование @java_iibrary · 11.6K subscribers
Post #1717 2.12K
У тебя несколько потоков-продюсеров, которые кладут элементы в очередь, и несколько потоков-консьюмеров, которые их оттуда забирают.
Если очередь полная, продюсеры ждут.
Если очередь пустая, консьюмеры ждут.

Как реализовать такую потокобезопасную ограниченную очередь?

На первый взгляд задача простая, но на деле она проверяет, насколько хорошо ты понимаешь синхронизацию и координацию потоков.

Ответ

Мы держим фиксированного размера буфер (Deque).

Продюсеры при вызове put ждут, если буфер заполнен.

Консьюмеры при вызове take ждут, если буфер пуст.

Когда продюсер кладёт элемент, он сигналит ожидающему консьюмеру.

Когда консьюмер забирает элемент, он сигналит ожидающему продюсеру.

Ожидание всегда делается внутри while, чтобы поток после пробуждения перепроверил условие.

Флаг close запрещает новые вставки и будит всех, чтобы они завершились корректно.

Предпочтительный способ это использовать ReentrantLock. Это как synchronized, только с большим контролем. Один и тот же поток может захватить его несколько раз без дедлока. Он позволяет создавать Condition-объекты — это очереди ожидания, привязанные к замку. Здесь удобно завести две: notFull и notEmpty, чтобы продюсеры и консьюмеры ждали и сигналили точно по ситуации.

👉 Java Portal
  • 👍 9
  • 🔥 3
  • ❤ 2
  • 🌭 2
  • 👀 1
More from @java_iibrary
  1. Sep 29, 2026Эволюция языков программирования 1940-е → Машинный код ⬇️ 1950-е → Ассемблер ⬇️ 1960-е → F…
  2. Sep 29, 2026Большинство Java-разработчиков используют эти термины каждый день. Удивительно, но многие…
  3. Sep 28, 2026💡 Java: не создавайте ресурсоёмкие объекты, пока они действительно не понадобятся. ✅ Иниц…
  4. Sep 28, 2026Проблема в продакшене. Приложение зависло. Вы запускаете: jstack <pid> Через несколько сек…
  5. Sep 27, 2026Java-разработчики, CopyOnWriteArrayList создаёт копию всего внутреннего массива при каждом…
  6. Sep 27, 2026Java-разработчики, ConcurrentHashMap потокобезопасен. Но он не блокирует всю коллекцию при…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →