если ключевое слово volatile в Java имеет какое-либо значение в случае одноядерных процессоров.
Оптимизация, используемая компилятором jit, может вызвать непредвиденное поведение.
static boolean foo = true;
public void bar(){
while(foo){
//doSomething
//do not modify foo in here
}
}
это может быть оптимизировано, так как foo не изменяется внутри цикла.
public void bar(){
while(true){
//Now this loop never ends
//changes to foo are ignored
}
}
make foo
volatile
сообщит компилятору jit, что foo
может быть изменен другим потоком, и доступ к нему не должен быть оптимизирован.
Это допустимое поведение, поскольку межпотоковый доступ гарантированно работает только с
- изменчивые и синхронизированные ключевые слова
- классы, которые утверждают, что они являются потокобезопасными (например, java.util.concurrent. *)
Обновление
Ключевое слово volatile не влияет на само переключение контекста, однако оно влияет на то, как оптимизируются операции чтения и записи переменных. Это влияет не только на использование кэша процессора (важно для многоядерных систем), но и на оптимизации, используемые компилятором точно в срок, как показано выше (важно для всех систем).