volatile作用:
使多个线程间变量可见。
线程变量不可见的示例:
public class MyThread extends Thread {
public boolean stop;
public void run() {
while(!stop){}
}
}
public class Main {
public static void main(String args[]) {
MyThread t = new MyThread();
t.start();
try {
Thread.sleep(1000);
} catch(InterruptedException e) {
e.printStackTrace();
}
t.stop = true;
}
}
运行结果,卡死不动:
解决办法:
修改boolean stop为volatile boolean stop;
volatile解决可见性问题的原理:
不加volatile,线程从私有内存读取数据,所以看不到其他线程的数据,加入volatile,线程从主内存读取数据。