原子性
满足变量 = 常量的形式(不是每一条java语句都是原子的)
int a = 100 原子
long b = 100L 不保证是原子的
double c = 100.0 不保证是原子的
Object o = new Object(); 引用的赋值是原子的
volatile long b = 100L 原子
volatile double c = 100.0 原子
可见性
JMM 共享变量在多线程之间不能及时看到改变,这个就是可见性的问题
代码重排序
1.为什么要进行重排序?优化执行效率,
2.哪些东西会对代码进行重排序?
编译期间 编译器 javac
运行期间 JVM(JIT Just In Time)
运行期间 CPU
3.单线程的情况下,重排序一定没问题
4.多线程情况下,没有这个保证
happen-before
JMM
1.模型分为主内存和工作内存
2.主内存只有一份(虚拟真实的内存)
3.工作内存,每个线程各有一个(虚拟真实的CPU缓存)
4.线程是不可以直接操作主内存中的数据的
1)先Load,把数据从主内存中加载到工作内存中
2)修改工作内存中的数据
3)在合适的时候,把数据保存会主内存,Save
5.这个和java内存区域划分是不同视角上的事情,无直接关系