Холостой цикл


Холостой цикл (также "холостое ожидание", англ. busy waiting) — реализация ожидания в компьютерной программе, в котором проверка определённого условия осуществляется в бесконечном цикле. Выход из бесконечного цикла происходит только при удовлетворении проверяемого условия.

В большинстве случаев холостой цикл считается антипаттерном, которого нужно избегать путём реорганизации кода или использование иного подхода к разработке (асинхронное выполнение, событийно-ориентированное программирование и т. п.).

Во фрагменте кода ниже один из потоков ожидает значения 0 в переменной i и только после этого продолжает исполнение:

Данная реализации использует обращение к методу Thread.sleep() в цикле, что позволяет приостановить исполнение потока на заданное количество миллисекунд:

При этом планировщик отдаёт вычислительные ресурсы другим потокам, из-за чего "усыпление" и "побудка" потока являются дорогостоящими операциями. Другим недостатком данного способа является необходимость обработки исключения, а также невозможность приостановить поток менее чем на 1 миллисекунду. Начиная с Java 9 появился метод Thread.onSpinWait(), который позволяет реализовать непродолжительное ожидание без приостановки потока:

Преимуществом данного подхода является возможность мгновенно прервать ожидание и продолжить выполнение.