介绍
volatile保证线程间变量的可见性,简单地说就是当线程A对变量X进行了修改后,在线程A后面执行的其它线程能看到变量X的变动,更详细的说是要符合以下两个规则:
- 线程对变量进行修改之后,要立刻写回到主存
- 线程对变量读取的时候,要从主内存读,而不是缓存。
volatile不能保证原子性。
实例测试
code:
/**
* volatile用于保证数据的同步,也就是可见性
* @author dxt
*
*/
public class VolatileTest {
private volatile static int num = 0;
public static void main(String[] args){
new Thread(new Runnable(){
public void run(){
while(num == 0){
//不用写代码
}
}
}).start();
try {
Thread.sleep(1000); //等一秒
} catch (InterruptedException e) {
e.printStackTrace();
}
//设置num = 1, 使线程停止循环,不加volatile,线程会持续执行,因为cpu没有时间
//将num=1写回内存
num = 1;
}
}