TGViewer
Java Portal | Программирование Java Portal | Программирование @java_iibrary · 11.6K subscribers
Post #1712 2.55K
Вот задача для собеседования по Java

У вас есть два потока.
Поток 1 печатает нечётные числа.
Поток 2 печатает чётные числа.

Как их синхронизировать так, чтобы вывод всегда шёл по порядку:
1 2 3 4 5…

Звучит просто, но заставляет внимательно подумать о координации потоков.

Ответ

Самый аккуратный способ это использовать семафоры.

Семафор управляет набором разрешений (токенов). Поток, вызывающий acquire, забирает разрешение, и если его нет — ждёт. Поток, вызывающий release, возвращает разрешение, чем будит ожидающий поток.

Мы создаём два семафора: один для нечётных, другой для чётных.
Семафор для нечётных изначально имеет 1 разрешение, чтобы первый поток мог стартовать, а для чётных — 0, чтобы он ждал. После того как нечётный поток печатает число, он делает release для чётного. Чётный поток делает acquire, печатает, и отдаёт разрешение обратно нечётному.

Такое чередование гарантирует точную последовательность 1 2 3 4 … без активного ожидания, без sleep и без гонок.

👉 Java Portal
  • 🔥 18
  • 👍 8
  • 👀 4
  • ❤ 3
  • 🏆 2
More from @java_iibrary
  1. Sep 30, 2026Docker прост, пока всё работает. Но что делать, если контейнер постоянно перезапускается,…
  2. Sep 29, 2026Эволюция языков программирования 1940-е → Машинный код ⬇️ 1950-е → Ассемблер ⬇️ 1960-е → F…
  3. Sep 29, 2026Большинство Java-разработчиков используют эти термины каждый день. Удивительно, но многие…
  4. Sep 28, 2026💡 Java: не создавайте ресурсоёмкие объекты, пока они действительно не понадобятся. ✅ Иниц…
  5. Sep 28, 2026Проблема в продакшене. Приложение зависло. Вы запускаете: jstack <pid> Через несколько сек…
  6. Sep 27, 2026Java-разработчики, CopyOnWriteArrayList создаёт копию всего внутреннего массива при каждом…
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 →