《深入理解 Java 虚拟机》学习 -- Java 内存模型
1. 区别
这里要和 JVM 内存模型区分开来:
- JVM 内存模型是指 JVM 内存分区
- Java 内存模型(JMM)是指一种虚拟机规范
2. 目的
缓存一致性
在硬件中,为了解决处理器与内存的速度矛盾,在两者之间使用了高速缓存,但也引入了新的问题:缓存一致性。
在多处理器系统中,每个处理器都有自己的高速缓存,而它们又共享同一主内存。当多个处理器的运算任务都涉及同一块主内存区域时,将可能导致各自的缓存数据不一致的情况。
为了解决一致性问题,需要各个处理器访问缓存时都遵循一些协议,这便是缓存一致性。
总结:
Java 内存模块是用来屏蔽掉各种硬件和操作系统的内存访问差异,以实现让 Java 程序在各种平台下都能达到一致的并发效果。
3. 主内存和工作内存
Java 内存模型的主要目标是定义程序中各个变量的访问规则,即在虚拟机中将变量存储到内存和从内存中取出变量这样的底层细节。
- Java 内存模型规定了所有的变量都存储在主内存中,每个线程有自己的工作内存。
- 线程的工作内存中保存了被该线程使用到的变量的主内存副本拷贝,线程对变量的所有操作(读取,赋值等)都必须在工作内存中进行,而不能直接读写主内存中的变量。不同线程之间也无法发直接访问对方工作内存中的变量,线程间变量值的传递均需要通过主内存来完成。
线程,主内存,工作内存三者的交互关系:
4. 内存间交互操作
关于主内存与工作内存之间具体的交互协议,即一个变量如何从主内存拷贝到工作内存、如何从工作内存同步回主内存之类的实现细节,Java 内存模型中定义了八种操作来完成,这里只讲解四种:
- read(读取):作用于主内存的变量,它把一个变量的值从主内存传输到线程的工作内存中,以便随后的 load 动作使用。
- load(载入):作用于工作内存的变量,它把 read 操作从主内存中得到的变量值放入工作内存的变量副本中。
- store(存储):作用于工作内存的变量,它把工作内存中一个变量的值传送到主内存中,以便随后的 write 操作使用
- write(写入):作用于主内存的变量,它把 store 操作从工作内存中得到的变量的值放入主内存的变量中
注意:
- 如果要把一个变量从主内存复制到工作内存,那就要按顺序地执行 read 和 load 操作,如果要把变量从工作内存同步回主内存,就要按顺序地执行 store 和 write 操作。
- Java 内存模型只要求上述两个操作必须按顺序执行,而没有保证必须是连续执行。即 read 与 load 之间、store 和 write 之间是可插入其他指令的。