Java言語では、再順序付けによってコードのセマンティクスに違いがない限り、コンパイルされたコードの行をコンパイラーが再配置できることはよく知られています。ただし、コンパイラは、現在のスレッドから見たセマティックについてのみ気にする必要があります。この並べ替えがマルチスレッドの状況でセマンティクスに影響を与える場合、通常は同時実行の問題が発生します(メモリの可視性)。
私の質問:
このfreedmをコンパイラに許可することで何が達成されますか?コードを再配置することで、コンパイラーがより効率的なコードを生成することは本当に可能ですか?私はこれについての実際的な事例をまだ見ていません。これがもたらす可能性のある並行性のリスクが、利益をはるかに上回っていると感じることがあります。
プログラマーがコンパイラーにこのような行を再配置しないように指示できる方法はありますか?同期プリミティブを使用すると、再配置の副作用を効果的に処理できることを知っていますが、これをオフにする直接的な方法(コンパイラオプション)があるかどうかを尋ねています。