I am a little confuse about how volatile variable effectively accesses from "main" memory. How's it different from a variable (non-volatile) that has a local copy ? What's the typical workflow whenever multiple threads accesses a non-volatile vs a volatile variable ? I mean how do they work behind the scene ?
1 Answer
Let's say you have a variable that can be accessed by multiple threads.
Thread 1 looks at the variable. Because looking at shared memory is more expensive than thread-local memory, it makes a copy of the variable. (Note that an object won't be copied, just its reference.)
Thread 2 looks at the same variable. It decides to change the variable. But Thread 1 doesn't know it! Thread 1 is still using stale data. This is a Very Bad Thing. By making it volatile, each thread must look at the original variable when accessing it. They aren't permitted to make local copies, so it won't get stale.
volatileis that it also ensure atomic reading of primitives. It is useful in case of 64bits variables (likelongordouble) on 32 bits processors machines because they prevent updating variable between reading first 32 and last 32 bits of variable.