可见性
volatile
变量在每次被线程访问时都强迫从主内中读取该变量的值,而该变量发生变化时都会强迫线程将该变量的值刷新到主内存中,这样,任何时候所有线程都能看到该变量的最新值
/**
* 当两个线程同时执行了第一步, 就都读到了count的值, 比如是5
* 两个线程同时执行了+1操作并写回主存,这样就丢了一次+1的操作,结果是6问不是5
*/
public static void add(){
// 1. 去读内存中的count值
// 2. +1
// 3. count写回主存
count++;
}
volatile
不具有原子性
使用volatile
需要具备两个条件:
- 对变量的写操作不依赖于当前值
- 该变量没有包含在具有其他变量的不变的式子中,因此
volatile
特别适合作为状态标记量。