java это Является ли изменчивая переменная «читается» так же быстро, как обычно?




volatile java что это (4)

Я знаю, что запись в volatile переменную сбрасывает ее из памяти всего процессора, однако я хочу знать, что если чтение изменчивой переменной происходит так же быстро, как и нормальное чтение?

Могут ли volatile переменные когда-либо размещаться в кэше процессора или всегда извлекаются из основной памяти?


volatile подразумевает, что компилятор не может оптимизировать переменную, поместив ее значение в регистр CPU. Он должен быть доступен из основной памяти. Однако он может быть помещен в кеш процессора. Кэш гарантирует согласованность между любыми другими CPU / ядрами в системе. Если память сопоставлена ​​с IO, тогда ситуация немного сложнее. Если он был разработан как таковой, аппаратное обеспечение предотвратит кэширование адресного пространства, и все обращения к этой памяти перейдут на аппаратное обеспечение. Если такой конструкции нет, разработчикам аппаратного обеспечения могут потребоваться дополнительные инструкции CPU, чтобы обеспечить чтение / запись через кеши и т. Д.

Как правило, ключевое слово «volatile» используется только для драйверов устройств в операционных системах.


Неустойчивые чтения не могут быть такими быстрыми, особенно для многоядерных процессоров (но и только одноядерных). Исходное ядро ​​должно извлекать из фактического адреса памяти, чтобы убедиться, что оно получает текущее значение - переменная действительно не может быть кэширована.

В отличие от одного другого ответа здесь, изменчивые переменные не используются только для драйверов устройств! Они иногда необходимы для написания высокопроизводительного многопоточного кода!


Это зависит от архитектуры. То, что volatile делает, говорит компилятору не оптимизировать эту переменную. Это заставляет большинство операций обрабатывать состояние переменной как неизвестное. Поскольку он изменчив, он может быть изменен другим потоком или другой аппаратной операцией. Таким образом, чтение должно будет перечитать переменную, и операции будут иметь вид read-modify-write.

Эта переменная используется для драйверов устройств, а также для синхронизации с мьютексами / семафорами в памяти.


Вы действительно должны проверить эту статью: http://brooker.co.za/blog/2012/09/10/volatile.html . В статье в блоге утверждается, что волатильные чтения могут быть намного медленнее (также для x86), чем нестабильные чтения на x86.

  • Тест 1 является параллельным чтением и записью в энергонезависимую переменную. Механизм видимости отсутствует, и результаты чтения являются потенциально устаревшими.
  • Тест 2 представляет собой параллельное чтение и запись в изменчивую переменную. Это не относится конкретно к вопросу ОП. Однако стоит отметить, что соперничающая летучесть может быть очень медленной.
  • Тест 3 - это считывание в летучее в узкой петле. Продемонстрировано, что семантика того, что значит быть изменчивым, указывает на то, что значение может меняться с каждой итерацией цикла. Таким образом, JVM не может оптимизировать чтение и вытащить его из цикла. В тесте 1, вероятно, значение было прочитано и сохранено один раз, поэтому фактическое «чтение» не происходит.

Кредит Марку Букеру за выполнение этих тестов.





volatile