Описание тега volatile
Volatile - это квалификатор, используемый для определения области хранения данных (объекта, поля, переменной, параметра), которая "может изменяться сама по себе", таким образом запрещая некоторые оптимизации генератора кода. В некоторых, но не во всех языках, которые распознают этот квалификатор, доступ к таким данным является потокобезопасным.
Изменчивые данные являются потокобезопасными в
- C#
- Java (5 и выше)
- Scala (в зависимости от версии ВМ)
Компиляторы обеспечивают такую семантику, выдавая инструкции барьера памяти в необходимом порядке.
Неустойчивые данные не являются потокобезопасными в некоторых реализациях
- C
- C++
- Джава
В этих языках от компиляторов требуется только воздерживаться от определенных оптимизаций кода, особенно тех, которые удаляют или изменяют порядок доступа к изменчивым данным. Это все еще полезно для некоторых специализированных целей:
- Доступ к устройствам с отображением памяти
- Укрощение нетипичных библиотечных конструкций, таких как
longjmp
. - Некоторые очень осторожные протоколы синхронизации потоков
(Нет никакой связи между энергозависимыми данными и энергонезависимой памятью.)