Хорошо известно, что язык Java позволяет компиляторам переупорядочивать строки скомпилированного кода до тех пор, пока переупорядочивание не влияет на семантику кода. Однако компилятор должен заботиться только о сематике, как видно из текущего потока. Если это изменение порядка влияет на семантику в многопоточной ситуации, это обычно вызывает проблемы параллелизма (видимости памяти).
Мои вопросы) :
Что достигается предоставлением этой свободы компилятору? Действительно ли компилятор может создать более эффективный код, перестроив код? Я еще не видел практического случая для этого. Иногда я чувствую, что преимущества, если таковые имеются, намного перевешиваются рисками параллелизма, которые это может привести.
Есть ли способ, которым программист может сказать компилятору не переставлять строки таким образом? Я знаю, что использование примитивов синхронизации эффективно справляется с побочными эффектами перестановки, но я спрашиваю, есть ли какой-либо прямой способ (опция компилятора) отключить это?