Компилятор также может переупорядочивать инструкции.
Например:
class SomeRunnable implements Runnable{
public boolean stop;
public void run(){
while(!stop)
println("hello");
}
}
Поскольку переменная stop не помечена как изменчивая (или не используется в синхронизированном блоке), компилятор можно бесплатно преобразовать приведенный выше код в:
class SomeRunnable implements Runnable{
public boolean stop;
public void run(){
if(stop)return;
for(;;)
println("hello");
}
}
Эта оптимизация называется «l oop инвариантное движение кода». Причина, по которой эта оптимизация сделана, состоит в том, чтобы уменьшить накладные расходы на чтение «стоп»; какой смысл его читать, если он не меняется в l oop.
Лучше не думать о кэшах, потому что:
- если только вы знаете, о чем говорите, возможно, вы это неправильно понимаете
- это зависит от архитектуры процессора.
Если вы хотите понять Java одновременный, тогда вам нужно чтобы понять модель памяти Java.