一、JVM模型
简称JMM
java内存模型围绕三个特性来建立的:原子性,可见性,有序性
(1)原子性
类似事务,要么执行完毕,要么不执行
(2)可见性
一个线程对共享变量做了修改之后,其他的线程立即能够看到(感知到)该变量这种修改(变化)
java虚拟机规范师徒定义一种java内存模型,来屏蔽各种硬件和操作系统的内存访问差异,让java程序在各种平台上都能达到一致的内存访问效果。简单的说:由于CPU执行指令的速度是很快的,但是内存访问的速度就慢了很多,相差的不是一个数量级,所以出现了高速缓存,JMM规定所有变量都是存在主内存中,每个线程又包含自己的工作内存。线程的操作是以工作内存为主,他们只能访问自己的工作内存,且工作前后都要把值同步回内存中。
除了volatile关键字能实现可见性之外,还有synchronized,Lock,final也是可以的。
(3)有序性
JMM是允许编译器和处理器对指令重排序的,但是规定了as-if-serial语句,即不管怎么重排序,程序的执行结果不能改变,
如: A和B可以重排序,C依托A和B,所以C不能和A,B重排序。
int a=3; //a
int b=4; //b
int d=a*b; //c
JMM保证了重排序不会影响到单线程的执行,但是在多线程却容易出问题,
int a=0;
boolean flag=false;
public void add(){
a=2;
flag=true;
}
public void remove(){
if(flag){
int end=a*a;
}
}
线程啊运行了write方法,指令重排序,先运行的是flag=true;线程B运行的是remove方法,这时候flag为true,但是a还为0,所以运行就出现异常。
(4)扩展:
被volatile修饰的共享变量,具有两点特性:
- 保证了不同线程对该变量操作的内存可见性
- 禁止指令重排序