Специализация
Python Backend Developer
Java Backend Developer
Node.js Backend Developer
Golang Backend Developer
React Frontend Developer
Выберите навыки
React
JavaScript
Git
Redux
Webpack
Сложность
1-3
4-6
7-8
9-10
Рейтинг вопросов
1
2
3
4
5
Подпишись на React Developer в телеграм
Что такое volatile в C?
volatile сообщает компилятору, что значение переменной может изменяться вне контроля программы (например, через прерывания или аппаратные регистры). Это предотвращает оптимизацию компилятором, которая могла бы удалить или переупорядочить обращения к такой переменной.
Что делает ключевое слово volatile?
Ключевое слово volatile предотвращает оптимизацию переменной компилятором. Это означает, что значение переменной будет всегда считываться заново, даже если код не меняет её значение, так как оно может быть изменено извне.
В чём особенности volatile и почему он не всегда обеспечивает потокобезопасность?
@Volatile обеспечивает только видимость, но не атомарность.
Зачем нужен volatile? Как он обеспечивает видимость изменений?
volatile гарантирует:
Видимость изменений для всех потоков
Запрет переупорядочивания операций
Атомарность чтения/записи (только для примитивов и ссылок)
Чем Atomic переменные отличаются от volatile?
volatile — гарантирует видимость изменений для всех потоков, но не поддерживает атомарные операции (например, i++).
Atomic-классы (AtomicInteger, AtomicBoolean) — обеспечивают атомарность операций (например, incrementAndGet()).
Защищает ли volatile от переупорядочивания инструкций?
Как volatile связан с happens-before?
Какие проблемы памяти решает volatile?
В каких случаях volatile не гарантирует корректную работу?
Какие проблемы многопоточности решает volatile?
Рейтинг:
5
Сложность:
7
Да, volatile частично защищает от переупорядочивания инструкций.
Запись в volatile поле запрещает переупорядочивание операций до и после неё.
Чтение из volatile также накладывает ограничения на порядок инструкций.
Однако volatile не делает код атомарным.
Он решает задачи видимости и порядка, но не взаимного исключения.
Рейтинг:
5
Сложность:
7
Запись в volatile поле формирует отношение happens-before с последующим чтением этого поля.
Это гарантирует видимость всех предыдущих записей.
Таким образом volatile используется как точка синхронизации.
Это одна из самых простых форм happens-before в Java.
Она широко используется в lock-free паттернах.
Рейтинг:
5
Сложность:
7
volatile гарантирует, что изменения переменной будут сразу видны всем потокам. Он решает проблему кэширования значений в регистрах и процессорных кэшах. Также volatile запрещает опасные переупорядочивания инструкций. При этом volatile не обеспечивает атомарность сложных операций. Это инструмент для видимости, а не для взаимного исключения.
Рейтинг:
5
Сложность:
8
volatile не гарантирует корректную работу, если операция состоит из нескольких шагов. Он не защищает от гонок данных и не обеспечивает атомарность. При изменении нескольких связанных переменных volatile также бесполезен. Для таких случаев нужны блокировки или атомарные классы. Использование volatile в сложной логике приводит к скрытым багам.
Рейтинг:
5
Сложность:
7
volatile гарантирует видимость изменений переменной между потоками. Если один поток изменил значение, другие увидят это изменение сразу. Он также запрещает некоторые переупорядочивания инструкций. При этом volatile не обеспечивает атомарность операций.
Рейтинг:
1
Сложность:
4
Рейтинг:
1
Сложность:
4
Рейтинг:
2
Сложность:
6
Рейтинг:
1
Сложность:
6
Рейтинг:
2
Сложность:
6