Насколько законна такая оптимизация компилятора?JAVA

Программисты JAVA общаются здесь
Anonymous
Насколько законна такая оптимизация компилятора?

Сообщение Anonymous »

Я читал книгу Джошуа Блоха «Эффективная Java». Автор показывает этот фрагмент кода в главе, посвященной параллелизму:

Код: Выделить всё

public class StopThread {
private static boolean stopRequested;

public static void main(String[] args) throws InterruptedException {
Thread backgroundThread = new Thread(() -> {
int i = 0;
while (!stopRequested) {
i++;
}
});
backgroundThread.start();

TimeUnit.SECONDS.sleep(1);
stopRequested = true;
}
}
затем говорит:

При отсутствии синхронизации это приемлемо для
виртуальная машина для преобразования кода:

Код: Выделить всё

while (!stopRequested)
i++;
в этот код:

Код: Выделить всё

if (!stopRequested)
while (true)
i++;
Я шокирован этим. Это полностью меняет смысл кода. Эти два понятия не эквивалентны, так как же виртуальная машина может выполнить такую ​​оптимизацию (на самом деле неправильно даже называть это оптимизацией)? Кто-нибудь может мне это объяснить?

Подробнее здесь: https://stackoverflow.com/questions/785 ... tion-legal

Вернуться в «JAVA»