可见性 & Volatile
可见性: 子线程将共享变量保存在自己工作内存的高速缓存中, 导致主线程对共享变量修改时,子线程不可见,读的仍旧是旧数据 |
![]() |
|---|---|
解决不可见性问题方案 |
1.Volatile: 易变的 关键字修饰 2.synchonized 需要monitor,太重量了 保证可见性的原理:
注意这里加了sout会自动停止
因为 println 内部的 synchronized 会强制刷新内存, 线程每次都重新读取主内存中的 flag, 于是它终于能看到 flag 变成 true,循环退出。 |
Volatile只能保证可见性,不保证原子性 |
对于i++之类的多字节码指令不确保其原子性 原子性用syn or reen |
| volatile改进两阶段终止模式 | Volatile boolean stop=false
} Stop=true Interrupt; //to wake up the sleeping thread |
| Balking犹豫模式 | ![]() |
volatile的写屏障




