What is the Java Memory Model?
The Java memory model specifies how the Java virtual machine works with the computer's memory (RAM). The Java virtual machine is a whole computer model, so it naturally includes a memory model - AKA the Java memory model.
It is vital to understand the Java memory model if you want to design correctly behaving concurrent programs. The Java memory model specifies how and when different threads can see values written to shared variables by other threads and how to synchronise access to shared variables when necessary.
A memory model is best thought of as the architecture that determines how different parts of memory (i.e. stack and heap) interact. The Java Virtual Machine (JVM) divides the memory into two logical units:
- Thread stack
- Heap
Thread stack
The thread stack is the part of the memory that stores the data specific to a thread. Every thread has its own thread stack. The thread stack stores local variables (both primitive and reference variables) of each method, whether the method belongs to an object or not.
When two separate threads call the same method, each thread creates its copy of the local variables declared in the method. Therefore, one thread cannot directly access the variables of another thread.
Heap
There is only one shared heap for the whole Java application. It stores the objects created and their member variables (both primitives and references). Any thread that has a reference to an object on the heap can access its member variables. Moreover, a single object on the heap can be referenced by the local variables of different threads.