UseMembar определяет, следует ли строго использовать инструкции мембраны, заставляя все действия с памятью завершать перед продолжением.
Это в основном не позволяет обработчикам с задержкой обработки памяти связываться с кодом.
Обычно это замедляет работу и не требуется на современных виртуальных машинах для подавляющего большинства кода.
Иногда вы сталкиваетесь с проблемами, когда код ДОЛЖЕН быть поточно-ориентированным, но не из-за отсутствия использования инструкций мембраны. В этих случаях вы можете включить это, чтобы заставить такой код работать, не переключаясь на однопоточность или возиться с порядком кода, чтобы предотвратить проблему.
JVM, как правило, хорошо обнаруживает код, который может вызвать проблемы, и либо вставляет мембрану, либо выполняет оптимизацию перестановки кода JIT, чтобы обеспечить время для выполнения операций с памятью. Фактически, в моем веб-поиске по этой теме я обнаружил только один пример ошибки, и она была исправлена в последних версиях Oracle и OpenJRE версий JVM горячей точки.
Как примечание, для архитектур ARM этот параметр по умолчанию по-прежнему включен, поскольку альтернативные оптимизации (известные как псевдо-мембранные оптимизации) еще не применялись, и, следовательно, они могут быть очень ошибочными без инструкций мембраны.