...
No caching through this lvalue: each operation in the abstract semantics must be performed (that is, no caching assumptions may be made, because the location is not guaranteed to contain any previous value). In the absence of this qualifier, the contents of the designated location may be assumed to be unchanged except for possible aliasing.
Although type Type qualifying objects as volatile ensures that a compiler does not perform unintended reordering or optimization, it in no way guarantees guarantee synchronization between multiple threads, protects protect against simultaneous memory accesses, or, unless used to declare objects of type sig_atomic_t, guarantees atomicity of accesses to the object. For restrictions specific to signal handlers, see SIG31-C. Do not access or modify shared objects in signal handlers.
...