Модель памяти Java: компилятор переупорядочивает строки кода

Хорошо известно, что язык Java позволяет компиляторам переупорядочивать строки скомпилированного кода до тех пор, пока переупорядочение не влияет на семантику кода. Однако компилятор должен заботиться только о сематике, как видно из текущего потока .Если это изменение порядка влияет на семантику в многопоточной ситуации, это обычно вызывает проблемы с параллелизмом (видимость памяти)

Мой вопрос (ы):

  1. Что достигается, разрешая эту freedm компилятору? Действительно ли компилятор может создать более эффективный код, изменив его порядок? Мне еще предстоит увидеть это на практике. Иногда мне кажется, что преимущества, если таковые имеются, намного перевешиваются рисками параллелизма, которые это может принести.

  2. Есть ли способ, которым программист может сказать компилятору, чтобы он не переставлял строки таким образом? Я знаю, что использование примитивов синхронизации эффективно справляется с побочными эффектами перекомпоновки, но я спрашиваю, есть ли какой-либо прямой способ (параметр компилятора) отключить это?

7
задан Peter Lawrey 12 April 2016 в 08:20
поделиться