Поскольку вас интересуют эти варианты использования, я объясню первый. Обратите внимание, что это применимо с точки зрения c / c ++, но я не уверен, как это работает в java, хотя я подозреваю, что в целом нестабильность в c / c ++ и java используется для совершенно разных случаев.
Устройства с отображенной памятью - это периферийные устройства, с которыми процессор взаимодействует так же, как и память, а не через специальную шину.
Предположим, у вас есть немного света с таймером, который отображен в памяти. Вы включаете свет, записывая 1 в его адрес памяти, и его внутренний таймер ведет обратный отсчет в течение 5 секунд, выключает свет и сбрасывает ячейку памяти на 0. Теперь вы разрабатываете программу переменного тока, которая должна включить этот свет после определенных событий. и иногда выключайте его до истечения срока действия счетчика. Если вы используете обычную переменную (обычно указатель или ссылку для этого типа приложения) для записи в ее область памяти, существует ряд вещей, которые могут пойти не так из-за оптимизации компилятора.
Если вы не работаете с таким количеством переменных и включаете свет и вскоре после его выключения без каких-либо других переменных, использующих это значение - иногда компилятор вообще избавится от первого присваивания, или в другом В этом случае он просто сохраняет значение в регистрах процессора и никогда не записывает в память. В обоих случаях свет не включается, поскольку память никогда не менялась.
Теперь подумайте о другой ситуации, когда вы проверяете состояние света и он включен. Здесь значение извлекается из памяти устройства и сохраняется в регистре процессора. Теперь, через несколько секунд, свет выключается сам по себе. Вскоре после этого вы пытаетесь снова включить свет, однако, поскольку вы прочитали этот адрес памяти и с тех пор не изменили его, компилятор предполагает, что значение по-прежнему равно единице и поэтому никогда не меняет его, хотя сейчас оно фактически равно 0.
Используя изменчивое ключевое слово, вы не допускаете, чтобы компилятор делал какие-либо из этих предположений при преобразовании вашего кода в машинный код, и обеспечивает выполнение всех этих конкретных операций строго так, как написано программистом. Это важно для устройств с отображенной памятью, главным образом потому, что расположение памяти не изменяется строго процессором. По этим же причинам многопроцессорные системы с общей памятью часто требуют аналогичных методов при работе в общем пространстве памяти.