[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"question-mnogopotochnost-dlya-chego-ispolzuetsya-klyuchevoe-slovo-volatile-synchronized-transient-native":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":21,"progress":22,"seo":23},249,"dlya-chego-ispolzuetsya-klyuchevoe-slovo-volatile-synchronized-transient-native",8,"mnogopotochnost","Многопоточность","🔀","Для чего используется ключевое слово volatile, synchronized, transient, native?","\u003C!-- grade: 3\u002F5 — описание volatile и synchronized поверхностное, transient и native не относятся к теме -->\n\n### volatile\n\nМодификатор **`volatile`** гарантирует две вещи:\n\n1. **Видимость (visibility)** -- при записи `volatile`-переменной значение немедленно сбрасывается в основную память, а при чтении -- берётся из основной памяти, а не из кэша потока. Все потоки всегда видят актуальное значение.\n2. **Запрет переупорядочивания (ordering)** -- компилятор и процессор не могут переместить операции чтения\u002Fзаписи `volatile`-переменной относительно других операций (создаётся memory barrier и устанавливается отношение happens-before).\n\n**Чего `volatile` НЕ гарантирует:**\n- **Атомарность** составных операций. Например, `count++` над `volatile int count` -- это три операции (чтение, инкремент, запись), которые НЕ атомарны.\n\n**Когда достаточно `volatile`:**\n- Переменная-флаг (`volatile boolean running = true`)\n- Паттерн «одна запись -- много чтений»\n- Публикация неизменяемого объекта\n\n### synchronized\n\nКлючевое слово **`synchronized`** обеспечивает:\n\n1. **Взаимное исключение (mutual exclusion)** -- только один поток может выполнять синхронизированный блок на одном мониторе одновременно.\n2. **Видимость** -- при входе в `synchronized` блок поток обновляет свой кэш из основной памяти, при выходе -- сбрасывает изменения в основную память.\n3. **Атомарность** -- все операции внутри `synchronized` блока выполняются как единое целое с точки зрения других потоков.\n\n```java\n\u002F\u002F Синхронизированный метод (монитор = this)\npublic synchronized void method() { \u002F* ... *\u002F }\n\n\u002F\u002F Синхронизированный блок (монитор = произвольный объект)\nsynchronized (lockObject) { \u002F* ... *\u002F }\n\n\u002F\u002F Статический синхронизированный метод (монитор = Class\u003C?>)\npublic static synchronized void staticMethod() { \u002F* ... *\u002F }\n```\n\n### transient\n\nКлючевое слово **`transient`** к многопоточности отношения не имеет. Оно указывает, что поле класса не должно сериализоваться при использовании стандартной сериализации Java (`Serializable`).\n\n### native\n\nКлючевое слово **`native`** к многопоточности также не относится. Оно указывает, что метод реализован в платформозависимом коде (обычно на C\u002FC++) через механизм JNI (Java Native Interface).\n\n### Сравнение volatile и synchronized\n\n| Характеристика | `volatile` | `synchronized` |\n|---|---|---|\n| Видимость | Да | Да |\n| Атомарность | Только для чтения\u002Fзаписи примитивов и ссылок | Да (весь блок) |\n| Взаимное исключение | Нет | Да |\n| Блокировка потока | Нет (неблокирующий) | Да (поток может быть заблокирован) |\n| Область применения | Только переменные | Методы и блоки кода |\n| Производительность | Выше | Ниже (из-за захвата\u002Fосвобождения монитора) |\n\n> **Аналогия из жизни.** `volatile` -- это табло объявлений в аэропорту: все видят одну и ту же актуальную информацию, но никто не мешает двум сотрудникам одновременно попытаться обновить табло. `synchronized` -- это кабинка с замком: только один человек может войти, и все изменения внутри будут завершены до того, как войдёт следующий.\n\n> **На собеседовании.** Этот вопрос -- ловушка: кандидаты иногда начинают подробно рассказывать о `transient` и `native`, хотя к многопоточности они не относятся. Покажите, что понимаете разницу, и сосредоточьтесь на `volatile` и `synchronized`. Самый частый подвопрос: «Почему `volatile` не достаточно для `count++`?» Ответ: потому что инкремент -- это три отдельные операции (read-modify-write), и `volatile` не делает их атомарными.","","junior",[15,16,17,18,19,20],"synchronized","ключевые слова","native","transient","volatile","concurrency",[],null,{"title":24,"description":25,"ogTitle":26,"ogDescription":27,"keywords":28,"schemaAnswer":34,"featuredSnippetReady":35},"volatile, synchronized, transient, native в Java — назначение — Gymterview","volatile отключает кэширование переменной потоками. synchronized обеспечивает синхронизацию. transient исключает поле из сериализации. native — платформозависимый код.","volatile, synchronized, transient, native — для чего каждое?","volatile — единственный экземпляр переменной для всех потоков. synchronized — синхронизация. transient — исключение из сериализации. native — нативный код.",[29,30,31,32,33],"volatile Java","synchronized Java","transient Java","native Java","ключевые слова многопоточность","volatile — вынуждает потоки использовать единственный экземпляр переменной без кэширования. synchronized — обеспечивает синхронизацию в методах или блоках кода. transient и native к многопоточности не относятся: transient исключает поле из сериализации, native указывает на платформозависимую реализацию метода.",true]