Назад к вопросам
СБЕР
Senior
5
Даёт ли volatile гарантию happens-before?
Компании, где спрашивали
Ответ от нейросети
sobes.tech AI
Ключевое свойство volatile в Java — обеспечение видимости изменений переменной между потоками, но оно не гарантирует полную happens-before семантику для всех операций.
Конкретно:
- Запись в volatile переменную happens-before последующему чтению этой же переменной из другого потока.
- Это значит, что изменения, сделанные до записи в volatile, будут видны потоку, который прочитает эту переменную.
Однако volatile не обеспечивает атомарность сложных операций (например, инкремент), и не гарантирует happens-before между другими действиями, не связанными с volatile.
Пример:
volatile int flag = 0;
int data = 0;
// Поток 1
data = 42; // обычная запись
flag = 1; // volatile запись
// Поток 2
if (flag == 1) { // volatile чтение
// гарантированно увидит data == 42
}
Таким образом, volatile даёт happens-before между записью и чтением самой volatile переменной, что обеспечивает видимость, но не заменяет полноценную синхронизацию для сложных сценариев.