Поведение volatile
не обязательно отличается; это платформа и контекст, который отличается. Вы конкретно упомянули устройства с отображенной памятью в своем вопросе. Если у вас есть устройство с отображенной памятью, например какое-то оборудование, которое может перевернуть регистр, который представлен переменной в вашем коде, тогда, очевидно, вам нужен способ указать это. Если вы этого не сделаете, то компилятор всегда будет работать при условии, что единственная система, которая может изменить ваш код, - это ваша программа и может оптимизировать ее.
Хороший пример может быть, если вы используете переменную в ситуации принятия решения или управления. Если эта переменная никогда не манипулируется в вашем коде напрямую, но может быть переброшена сигналом или каким-либо отображаемым в памяти оборудованием, компилятор может оптимизировать условие принятия решения до логического значения, так как он будет предполагать, что значение не изменится. Поэтому, когда аппаратное обеспечение переворачивает значение, оно не отражается в работающем коде из-за оптимизации компилятора.
Java "кэши" в основном одинаковы. Кажется, что ваше разъединение происходит из-за того, что вы не устанавливаете ментальный мост между компилируемым кодом C и Java, являющимся JIT-компилируемым байтовым кодом, работающим внутри виртуальной машины. Java наследует свое поведение volatile
от C, но последствия этого поведения радикально отличаются из-за контекста времени выполнения.