1、Java内存模型 vs JVM 运行时数据区
Java语言规范提出 java内存模型
Java虚拟机规范提出 JVM运行时数据区
2、Java内存模型是一系列规则
3、为什么提出:
多线程中的问题:
1、所见非所得
2、无法用肉眼去检测程序的准确性
3、不同的运行平台有不同的表现
4、错误很难重现
CPU指令重排:
Java编程语言的语义允许 Java编译器(JIT) 和微处理器(CPU)进行执行优化,这些优化
导致了与其交互的代码不再同步,从而导致看似矛盾的行为。
JIT编译器(Just in Time C)
解释执行:即脚本,在执行时,由语言的解释器将其一条条翻译成机器可识别的指令。
编译执行:将我们编写的程序,直接编译成机器可以识别的指令码。
beijing/src/com/desperado/jmm at master · zhangwangyan/beijing · GitHub
volatile关键字:
可见性问题:让一个线程对共享变量的修改,能够及时的被其他线程看到。
Java内存模型规定:对volatile变量v的写入,与所有其他线程后续对v的读同步
要满足这些条件,所以volatile关键字就有这些功能:
1、禁止缓存:
volatile变量的访问控制符会加个ACC_VOLATILE
2、对volatile变量相关的指令不做重排序。
共享变量定义:
线程间操作:
对于同步的规则定义:
Happens-before先行发生原则: