Java 内存模型 , 即 Java Memory Model,JMM 来屏蔽各种硬件和操作系统的内存访问差异,以实现让Java 在各种平台都达到一致的访问效果.Java 内存模型规范了 JVM 如何 禁用缓存 和 编译优化 的方法.
下面我就用图文并茂的方式给大家展示一下: Thread,Main Memory和Working Memory的交互关系
那么,变量是如何通过Main Memory copy给 Working Memory,如何从 Work Memory sync 到 Main Memory的呢?
jvm实现必须保证每一种操作都是原子的,不可细分的(double 和 long比较特殊)
Java 提出了 8种操作类型
变量作用域: Main Memory
方法 | 作用 |
---|---|
lock(:lock:) | 把Thread 设置线程独有 Tag |
unlock(:unlock:) | 释放变量,给其他Thread使用 |
read(读取) | 变量从Main Memory传输到Thread 的 Working Memory途径 |
变量作用域: Working Memory
方法 | 作用 |
---|---|
load(载入) | 变量值放到Working Memory 的变量副本中 |
use(使用) | Working Memory的变量值传给执行引擎,JVM收到需要执行的变量的字节码指令时候,会执行这个操作 |
assign(赋值) | 他把一个从执行引擎接收的值赋给Working Memory 的变量,JVM收到需要执行的变量的字节码指令时候,会执行这个操作 |
store(存储) | 把变量值传给 Main Memory |
变量作用域: Main Memory
方法 | 作用 |
---|---|
write(写入) | Working Memory的变量放到Main Memory中 |
太官方,主要是为了解决Java并发安全,Android用的不太多,只想理清流程,不想看细节~
没有被volatile位数据可以分割为两个32位进行操作,volatile和syhnronized功能类似,解决多Thread竞争问题
long 和 double 具有非原子性,不需要用考虑使用volatile修饰