volatile是轻量级的synchronized,它在多线程中保证了变量的“可见性”。可见性的意思是当一个线程修改了一个变量的值后,另外的线程能够读取到这个变量修改后的值。
看下如果不加 volatile 的情况:
public class MyTest {
public static void main(String[] args) {
Volatile run = new Volatile();
Thread t1 = new Thread(){
@Override
public void run() {
run.run();
}
};
Thread t2 = new Thread(){
@Override
public void run() {
run.run();
}
};
Thread t3 = new Thread(){
@Override
public void run() {
run.modifyFlag(false);
System.out.println("false");
}
};
t1.start();
t2.start();
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
t3.start();
}
}
class Volatile {
private boolean flag = true;
public void run() {
System.out.println(Thread.currentThread().getName()+"正在执行"+flag);
while(flag){
//注意这边不能有代码,如果有 volatile 的测试就会失败
}
System.out.println(Thread.currentThread().getName()+"执行结束"+flag);
}
public void modifyFlag(boolean flag){
this.flag = flag;
}
}
对 flag 加上 volatile