CPU操作速度, 寄存器 > 缓存 > 主存 主存也叫RAM
不管是栈和堆大部分都会存储到主存中,一部分堆和栈的数据可能会存储到寄存器中
当对象中的各变量存储到计算机内存时:
1. 共享对象对各个线程的可见性
2. 共享对象的竞争现象
CPU的线程读取主存中的共享变量到缓存中, 然后对共享变量的更改没有同步到主存中,此时对另一个线程来说共享变量将无法更新可以使用violate关键字:violate关键字将直接从主存中读取,对变量的更新也会直接写入到主存中, violate基于内存屏障指令实现
violate 可见性, 原子性, 禁止JVM指令重排
内存屏障:
保证特定操作的执行顺序,影响某些数据(或则是某条指令的执行结果)的内存可见性
指令重排:
在计算机执行指令的顺序在经过程序编译器编译之后形成的指令序列, CPU和编译器为了提高程序的执行效率,会按照一定的规则进行指令优化,在某些情况下会产生逻辑问题, 在并发情况下会产生二义性
as-if-serial: 不管怎么排序,单线程的执行结果不会变
as-if-serial语义把单线程程序保护了起来,遵守as-if-serial语义的编译器,runtime 和处理器共同为编写单线程程序的程序员创建了一个幻觉:单线程程序是按程序的顺序来执行的。as-if-serial语义使单线程程序员无需担心重排序会干扰他们,也无需担心内存可见性问题
java 内存模型
所有的变量都存储在主内存中,每个线程都有自己的工作内存,线程的工作内存中保存了线程变量的主内内存拷贝,线程对所有变量的操作都必须在工作内存中进行,而不能直接读写主内存变量
主内存主要对应java堆中的对象实例数据部分, 工作内存主要对应于java虚拟机栈中的部分
网友评论