[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"question-mnogopotochnost-chto-takoe-race-condition":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":19,"progress":20,"seo":21},259,"chto-takoe-race-condition",8,"mnogopotochnost","Многопоточность","🔀","Что такое race condition?","\u003C!-- grade: 3\u002F5 — определение верное, но нет примера кода -->\n\n**Состояние гонки (race condition)** -- это ошибка проектирования многопоточной программы, при которой корректность работы зависит от порядка выполнения потоков. Поведение программы становится **недетерминированным**: при одном порядке выполнения результат правильный, при другом -- ошибочный.\n\n### Два типа race condition\n\n| Тип | Описание | Пример |\n|---|---|---|\n| **Check-then-act** | Проверка условия и действие на его основе -- не атомарны | `if (map.containsKey(key)) map.get(key)` |\n| **Read-modify-write** | Чтение, изменение и запись значения -- не атомарны | `count++` |\n\n### Пример: check-then-act\n\n\u003Cdetails>\n\u003Csummary>Пример: гонка при ленивой инициализации\u003C\u002Fsummary>\n\n```java\npublic class LazyInitRace {\n    private static ExpensiveObject instance;\n\n    \u002F\u002F НЕ потокобезопасно!\n    public static ExpensiveObject getInstance() {\n        if (instance == null) {         \u002F\u002F Поток A проверяет — null\n            \u002F\u002F Поток B тоже проверяет — null\n            instance = new ExpensiveObject(); \u002F\u002F Оба создают экземпляр!\n        }\n        return instance;\n    }\n}\n```\n\n\u003C\u002Fdetails>\n\n### Пример: read-modify-write\n\n\u003Cdetails>\n\u003Csummary>Пример: гонка при инкременте счётчика\u003C\u002Fsummary>\n\n```java\npublic class CounterRace {\n    private int count = 0;\n\n    \u002F\u002F НЕ потокобезопасно!\n    public void increment() {\n        count++; \u002F\u002F Три операции: read → modify → write\n    }\n\n    \u002F\u002F Возможный сценарий при count = 5:\n    \u002F\u002F Поток A: read count → 5\n    \u002F\u002F Поток B: read count → 5\n    \u002F\u002F Поток A: write count → 6\n    \u002F\u002F Поток B: write count → 6  ← Должно быть 7!\n}\n```\n\n\u003C\u002Fdetails>\n\n### Почему race condition опасен\n\n1. **Недетерминированность** -- баг может проявляться один раз на тысячу запусков, что делает его крайне сложным для воспроизведения.\n2. **Зависимость от окружения** -- на машине разработчика (1 ядро) баг не воспроизводится, а на production-сервере (64 ядра) -- постоянно.\n3. **Каскадные последствия** -- повреждение данных, нарушение инвариантов, «невозможные» состояния объектов.\n\n> **Аналогия из жизни.** Два человека одновременно проверяют, есть ли молоко в холодильнике, видят, что нет, и оба идут в магазин. В итоге -- два пакета молока вместо одного. «Проверил -- пусто» и «пошёл купить» -- не атомарная операция.\n\n> **На собеседовании.** Назовите два типа race condition: check-then-act и read-modify-write. Приведите конкретный пример кода. Подчеркните, что race condition проявляется недетерминированно и зависит от таймингов -- это делает его одним из самых сложных классов багов. Также упомяните инструменты обнаружения: Thread Sanitizer (для native кода), JCStress (для Java-кода), а также статический анализ (FindBugs\u002FSpotBugs с детектором `MT_CORRECTNESS`).","","middle",[15,16,17,18],"race condition","состояние гонки","concurrency","ошибка проектирования",[],null,{"title":22,"description":23,"ogTitle":24,"ogDescription":25,"keywords":26,"schemaAnswer":31,"featuredSnippetReady":32},"Race condition (состояние гонки) в Java — Gymterview","Race condition — ошибка многопоточной системы, при которой результат зависит от порядка выполнения потоков. Приводит к недетерминированному поведению.","Race condition — когда порядок потоков решает всё","Состояние гонки — ошибка, при которой поведение системы зависит от того, какой поток выполнится первым. Результат недетерминирован.",[27,28,29,30],"race condition Java","состояние гонки Java","гонка потоков","race condition пример","Race condition (состояние гонки) — ошибка проектирования многопоточной системы, при которой работа зависит от порядка выполнения потоков. Когда поток, который должен исполниться первым, проигрывает гонку — поведение кода изменяется непредсказуемо.",true]