四、共享模式之内存
4.1java内存模型
JMM即Java Memory Model,他定义了主存,工作内存抽象概念,底层对应着cpu寄存器,缓存、硬件内存、cpu指令优化等。
JMM主要体现在以下几个方面
- 原子性:保证指令不会受到线程上下文切换
- 可见性:保证指令不会受到cpu缓存的影响
- 有序性:保证指令不会受到指令cpu指令并行优化的影响
4.2可见性
退不出的循环
Volatile原理
- volatile的底层实现原理是内存屏障
- 对volatile变量的写指令后会加入写屏障
- 对volatile变量的读指令前会加入读屏障
volitail变量的如何保证可见性
- 写屏障,保证在该屏障之前,对共享变量的改动,都同步到主存当中
private boolean read == false;
public void test(){
num = 2;
read = true; //对共享变量进行了读,那么从这一句之后就开始加入了写屏障
//写屏障
}
- 读屏障,保证了在该屏障之后,对共享变量的读取,加载的都是主存中最新的数据
public void actors(){
//读屏障
//.....这后面都是读屏障的内容
if(ready){
r=num+num;//像这种num共享变量都是从主存中拿到的最新数据
}
}
volatile变量如何保证有序性
- volatile写屏障保证了写屏障之前的指令不会重排到写屏障之后
- volatile读屏障保证了读屏障之后的指令不会重排到读屏障之前