Нет, это просто невозможно.Если бы компилятор и JVM должны были это сделать, вполне вероятно, что ограничения, установленные моделью памяти языка программирования , были бы нарушены.
В частности, порядок синхронизации порядок, указанный в спецификации языка Java, будет нарушен.Если компилятор или JVM * должны были удалить любые «нежелательные» синхронизации, то любая дальнейшая оптимизация нарушила бы любые предположения, сделанные разработчиком в отношении порядка синхронизации (и случая до).В вашем конкретном случае любая запись в целое число произойдет до чтения в компиляторе / JVM, который подчиняется модели памяти Java.
Компилятор / JVM, который удаляет синхронизации, просто приведет к нарушению модели памяти.Например, встраивание метода может выполняться без компиляции / JVM, помещающей барьер памяти перед чтением целочисленного значения, что позволяет считывать устаревшие значения из кэшированного значения.
* Обратите внимание, ссылка на компилятор / JVM duo является преднамеренной.Компилятор будет генерировать только байт-код, соответствующий JLS;JVM может просто иметь ошибку, из-за которой требования модели памяти все еще могут быть нарушены.Для полноты модели памяти и компилятор, и JVM должны соответствовать требованиям, установленным моделью памяти.