可见性 & Volatile

可见性:

子线程将共享变量保存在自己工作内存的高速缓存中,

导致主线程对共享变量修改时,子线程不可见,读的仍旧是旧数据

image1

解决不可见性问题方案

1.Volatile: 易变的 关键字修饰

2.synchonized 需要monitor,太重量了

保证可见性的原理:
每次加锁之前会将变量从主内存读取到工作缓存中,
每次解锁之前会将变量的值同步回主内存

image2

注意这里加了sout会自动停止

因为 println 内部的 synchronized 会强制刷新内存,

线程每次都重新读取主内存中的 flag,

于是它终于能看到 flag 变成 true,循环退出。

Volatile只能保证可见性,不保证原子性

对于i++之类的多字节码指令不确保其原子性
原子性用syn or reen
volatile改进两阶段终止模式

Volatile boolean stop=false


new thread(){

While(true){

If(stop){

Return;

}

Sleep();//avoid keeping ask

}

}

Stop=true

Interrupt; //to wake up the sleeping thread

Balking犹豫模式 image4

volatile的写屏障
image5

image6