[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"question-mnogopotochnost-chto-takoe-busy-spin":3},{"id":4,"slug":5,"topicId":6,"topicSlug":7,"topicName":8,"topicEmoji":9,"question":10,"answer":11,"codeLang":12,"codeSrc":12,"important":12,"commonMistakes":12,"modernUsage":12,"difficulty":13,"tags":14,"related":20,"progress":21,"seo":22},283,"chto-takoe-busy-spin",8,"mnogopotochnost","Многопоточность","🔀","Что такое busy spin?","\u003C!-- grade: 3\u002F5 — краткое, но корректное объяснение; добавлены примеры и контекст применения -->\n\n**Busy spin** (активное ожидание) — это техника, при которой поток ожидает наступления условия, выполняя **пустой цикл**, вместо того чтобы отдавать процессорное время через `wait()`, `sleep()` или `yield()`.\n\n```java\n\u002F\u002F Busy spin — поток не уступает процессор\nwhile (!condition.isReady()) {\n    \u002F\u002F Пустое тело цикла — «крутимся» на процессоре\n}\n\n\u002F\u002F С Thread.onSpinWait() (Java 9+) — подсказка процессору\nwhile (!condition.isReady()) {\n    Thread.onSpinWait(); \u002F\u002F hint: процессор может снизить энергопотребление\n}\n```\n\n**Зачем это нужно?** Когда поток уступает процессор (через `sleep()`, `yield()`, `park()`), операционная система может перенести его на другое ядро при возобновлении. Это приводит к **перестройке кэша процессора (cache migration)**, что является дорогой операцией.\n\nBusy spin сохраняет поток на том же ядре, поэтому данные остаются в L1\u002FL2-кэше. Это критично в системах с **микросекундными задержками** (low-latency).\n\n**Когда применять:**\n\n| Сценарий | Подходит busy spin? |\n|---|---|\n| Ожидание \u003C 1 мкс | Да |\n| Ожидание > 100 мкс | Нет — лучше `LockSupport.parkNanos()` |\n| Высоконагруженные финансовые системы | Да (LMAX Disruptor) |\n| Обычные серверные приложения | Нет — расход CPU не оправдан |\n\n**`Thread.onSpinWait()` (Java 9+)** — специальная подсказка JVM\u002Fпроцессору, что поток выполняет busy spin. На x86 транслируется в инструкцию `PAUSE`, которая снижает энергопотребление и уменьшает конкуренцию за ресурсы процессора между гиперпотоками (hyper-threads).\n\n> **Аналогия:** busy spin — это когда вы стоите у двери и каждую секунду дёргаете ручку, проверяя, не открыли ли. `sleep()` — вы садитесь на скамейку и ставите будильник. Busy spin дороже (вы постоянно заняты), но вы реагируете мгновенно, как только дверь откроется.\n\n> **На собеседовании** вопрос про busy spin проверяет понимание low-level оптимизаций. Хороший ответ включает упоминание cache locality, `Thread.onSpinWait()` и примеры (Disruptor, LMAX). Также стоит отметить, что с Virtual Threads busy spin антипаттерн — он блокирует carrier thread без возможности переключения.","","middle",[15,16,17,18,19],"кэш-процессора","ожидание","busy-spin","оптимизация","concurrency",[],null,{"title":23,"description":24,"ogTitle":25,"ogDescription":26,"keywords":27,"schemaAnswer":33,"featuredSnippetReady":34},"Что такое busy spin в Java — активное ожидание без уступки CPU — Gymterview","Busy spin — техника активного ожидания пустым циклом вместо wait\u002Fsleep\u002Fyield. Сохраняет кэш процессора, избегая переключения на другое ядро.","Busy spin в Java — зачем крутить пустой цикл?","Busy spin сохраняет кэш процессора, выполняя пустой цикл вместо уступки CPU через wait\u002Fsleep. Избегает перестройки кэша при смене ядра.",[28,29,30,31,32],"busy spin Java","активное ожидание","busy waiting","кэш процессора Java","spin lock","Busy spin — техника, при которой поток ожидает условия, выполняя пустой цикл, вместо вызова wait(), sleep() или yield(). Это сохраняет кэш процессора, так как в многоядерных системах приостановленный поток может продолжить выполнение на другом ядре, что влечёт затратную перестройку процессорного кэша.",true]