Предположим, что 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.