UseMembar determines whether or not to use membar instructions in a strict manner, forcing all memory actions to complete before continuing.
It basically stops the processor's delayed memory handling optimizations from messing with the code is handled.
This generally slows things down, and isn't necessary on modern VMs for the vast majority of code.
Occasionally you run into issues where code SHOULD be thread-safe but isn't because the lack of membar instruction use. In these cases you can turn this on to get such code to work without switching to single-threading or messing around with the code's ordering to prevent the issue.
The JVM is generally good at detecting code that will cause problems and either insert a membar or do a JIT code rearrange optimization to provide time for the memory operations to complete. In fact, in my web search on the topic, I only found one example of the bug, and it was fixed in recent versions of both the Oracle and OpenJRE versions of the hotspot JVM.
As a note, for ARM architectures this option still defaults to on, because alternate optimizations (known as psuedo-membar optimizations) have not been applied yet, and thus it is subject to be very buggy without membar instructions.