tgoop.com/Java_Iibrary/1712
Last Update:
Вот задача для собеседования по Java
У вас есть два потока.
Поток 1 печатает нечётные числа.
Поток 2 печатает чётные числа.
Как их синхронизировать так, чтобы вывод всегда шёл по порядку:
1 2 3 4 5…
Звучит просто, но заставляет внимательно подумать о координации потоков.
Ответ
Самый аккуратный способ это использовать семафоры.
Семафор управляет набором разрешений (токенов). Поток, вызывающий acquire, забирает разрешение, и если его нет — ждёт. Поток, вызывающий release, возвращает разрешение, чем будит ожидающий поток.
Мы создаём два семафора: один для нечётных, другой для чётных.
Семафор для нечётных изначально имеет 1 разрешение, чтобы первый поток мог стартовать, а для чётных — 0, чтобы он ждал. После того как нечётный поток печатает число, он делает release для чётного. Чётный поток делает acquire, печатает, и отдаёт разрешение обратно нечётному.
Такое чередование гарантирует точную последовательность 1 2 3 4 … без активного ожидания, без sleep и без гонок.

