什么是Volatile
Volatile 关键字的作用是变量在多个线程之间可见。
代码:
package com.thread.test;
/**
* @author 作者:wx
* @createDate 创建时间:Aug 30, 2019 3:14:49 PM
*/
public class ThreadVolatileTest {
public static void main(String[] args) throws InterruptedException {
VolatileDemo volatileDemo=new VolatileDemo();
Thread thread=new Thread(volatileDemo);
thread.start();
Thread.sleep(3000);
//主线程修改全局变量为false
volatileDemo.setFlag(false);
System.out.println("flag已经被修改为false");
Thread.sleep(1000);
System.out.println(volatileDemo.flag);
}
}
class VolatileDemo implements Runnable{
public boolean flag=true;
@Override
public void run() {
System.out.println("子线程开始执行.......");
while(flag) {
}
System.out.println("子线程关闭执行......");
}
public void setFlag(boolean flag) {
this.flag=flag;
}
}
运行结果:
已经将结果设置为fasle为什么?还一直在运行呢。
原因:线程之间是不可见的,读取的是副本,没有及时读取到主内存结果。
解决办法:
使用Volatile关键字将解决线程之间可见性, 强制线程每次读取该值的时候都去“主内存”中取值
public volatile boolean flag=true;