volatile不是线性安全的
对一个volatile变量的读,总是能看到(任意线程)对这个volatile变量最后的写入
通常用于在多线程环境下只有一个线程更改值,其他线程读取值的情况
非线性安全测试代码
public class VolatileTest {
public static volatile int num = 0;
public static void main(String[] args) throws Exception {
for (int i = 0; i < 100; i++) {
new Thread(new Runnable() {
public void run() {
for (int j = 0; j < 100; j++) {
num++;
}
}
}).start();
}
Thread.sleep(2000);
System.out.println(num);
}
}
输出的不是10000
volatile变量的一种典型用法,就是用于那些状态的标记,例如:
volatile boolean flag=false;
while(!flag){
doSomething();
}