我下面的代码没用Volatile 修饰flag,所以程序会一直运行,但是,我在while(flag)里面随便打印一句话,结果,结果程序就停了,这是为什么呢
class ThreadVolatile1 extends Thread{
public boolean flag=true;
@Override
public void run() {
// TODO Auto-generated method stub
System.out.println("开始执行子线程");
while(flag) {
//System.out.println("输出");
}
System.out.println("线程停止");
}
public void setRunning(boolean flag) {
this.flag=flag;
}
}
public class ThreadVolatile{
public static void main(String[] args) throws Exception{
ThreadVolatile1 demo=new ThreadVolatile1();
demo.start();
Thread.sleep(3000);
demo.setRunning(false);
System.out.println("flag设置成false");
Thread.sleep(1000);
System.out.println(demo.flag);
}
}
如你所愿:volatile 加上就OK。
保证了不同线程对这个变量进行操作时的可见性,即一个线程修改了某个变量的值,这新值对其他线程来说是立即可见的。(实现可见性)
public volatile boolean flag = true;
https://www.jianshu.com/p/8755e8fd1d20
https://www.cnblogs.com/xiaoxi/p/7251171.html