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先行发生原则:




本文深入探讨了Java内存模型和JVM运行时数据区的区别,指出Java内存模型是为了解决多线程中的可见性、有序性问题。CPU指令重排和JIT编译器可能导致并发问题,而volatile关键字则用于确保共享变量的可见性。同时,介绍了Happens-before原则作为并发编程的重要概念。文章还涉及了线程间操作和同步规则,帮助理解Java内存管理的关键点。
1358

被折叠的 条评论
为什么被折叠?



