Существует два различных варианта использования ключевого слова volatile.
- Запрещает JVM читать значения из регистра (предполагается, что он является кешем) и принудительно считывает его значение из памяти.
- Снижает риск ошибок согласованности памяти.
Запрещает JVM читать значения в регистре и принудительно
значение для чтения из памяти.
A флаг занятости используется для предотвращения продолжения потока, когда устройство занято и флаг не защищен блокировкой:
while (busy) {
/* do something else */
}
Поток тестирования продолжится, когда другой поток отключит флаг занят :
busy = 0;
Однако, поскольку в потоке тестирования часто осуществляется доступ к занятым объектам, JVM может оптимизировать тест, поместив значение занятости в регистр, а затем протестировать содержимое регистра без чтения значения занятости в памяти перед каждым тестом. Поток тестирования никогда не увидит изменения занятости, а другой поток только изменит значение занятости в памяти, что приведет к взаимоблокировке. Объявление флаг занятости как volatile заставляет его значение считываться перед каждым тестом.
Снижает риск ошибок согласованности памяти.
Использование энергозависимых переменных снижает риск ошибок согласованности памяти , потому что любая запись в энергозависимую переменную устанавливает
отношение "происходит до" с последующим чтением этой же переменной. Это означает, что изменения в энергозависимой переменной всегда видны другим потокам.
Техника чтения, записи без ошибок согласованности памяти называется атомарное действие .
Атомное действие - это то, что эффективно происходит одновременно. Атомное действие не может остановиться в середине: оно либо происходит полностью, либо вообще не происходит. Никакие побочные эффекты атомного действия не видны, пока действие не завершено.
Ниже приведены действия, которые можно указать как атомарные:
- Чтение и запись являются атомарными для ссылочных переменных и для большинства
примитивные переменные (все типы, кроме long и double).
- Чтение и запись являются атомарными для всех объявленных переменных volatile
(включая длинные и двойные переменные).
Ура!