It tells that compiler that this variable will be used by many threads at the same time. And not to create any cache copies, in the code that is compiled.
You don't think thats a too overly compiler centric answer? When you say compiler are you speaking of hotspot and JIT or something? I think it may be better to tell the VM as a whole this information as opposed to the compiler, especially javac.
Note: it also prevents reading of long and double, float while their values are being changed (since they each take at least two writes to change their values). This is probably the only useful use if even this one is...