What does the volatile keyword guarantee in Java's memory model? Describe visibility, ordering (happens-before), and restrictions on instruction reordering around volatile accesses. Clarify what volatile does not guarantee (e.g., atomicity of compound operations) and compare it with synchronized/locks; give example use cases.