Предположим, что a volatile int a. Один поток выполняет
while (true) {
a = 1;
a = 0;
}
а другой поток
while (true) {
System.out.println(a+a);
}
Теперь, было ли незаконным компилятор JIT испускать сборку, соответствующую 2*a вместо a+a?
С одной стороны, сама цель волатильного чтения состоит в том, что он всегда должен быть свежим из памяти.
С другой стороны, нет никакой точки синхронизации между двумя чтениями, поэтому я не вижу, что было бы незаконно обрабатывать a+a атомарно, и в этом случае я не вижу, как оптимизация, такая как 2*a нарушит спецификацию.
Приветствуются ссылки на JLS.