volatile可以保证程序每次读取得都是最新值:
如下程序永远不会输出执行结束:i
public class VolatileTest {
private boolean flag = true;
//private volatitle boolean flag = true;
public static void main(String[] args) throws Exception {
VolatileTest v = new VolatileTest();
System.out.println("代码开始执行了...");
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
int i = 0;
while (v.flag){
i++;
}
System.out.println("执行结束了:" + i);
}
});
t1.start();
TimeUnit.SECONDS.sleep(2);
v.flag = false;
System.out.println("设置为false...");
}
}
使用volatitle修饰,2秒后会输出执行结束了:i。
volatile会阻止编译时对java源代码的重排序;
volatitle不能保证对修饰变量的操作时原子性操作。