В java, насколько я знаю, переменная volatile заставляет поток читать/писать непосредственно на главный процессор (не в кэш каждого потока), поэтому делает ее изменение видимым для других потоков.
То, что я не знаю: Почему эта работа (volatile) может предотвратить компилятор/CPU переупорядочивание кода.
спасибо :)