什么是Volatile
Volatile 保证了线程间共享变量的及时可见性,但不能保证原子性。
可见性也就是说一旦某个线程修改了该被volatile修饰的变量,它会保证修改的值会立即被更新到主存,当有其他线程需要读取时,可以立即获取修改之后的值。
在Java中为了加快程序的运行效率,对一些变量的操作通常是在该线程的寄存器或是CPU缓存上进行的,之后才会同步到主存中,而加了volatile修饰符的变量则是直接读写主存。
案例:
案例说明:创建一个线程启动while(flag)循环,等3m过后,设置flag值为false,但是while循环并没停止。
解决:全局变量添加volatile可见性关键字。
class ThreadDemo004 extends Thread {
public boolean flag = true;
// public volatile boolean flag = true;
@Override
public void run() {
System.out.println("线程开始...");
while (flag) {
// 死循环
}
System.out.println("线程结束...");
}
// 启动死循环\停止死循环
public void setRuning(boolean flag){
this.flag=flag;
}
}
public class Test0004 {
public static void main(String[] args) throws InterruptedException {
ThreadDemo004 th = new ThreadDemo004();
th.start();
Thread.sleep(3000);
th.setRuning(false);
System.out.println("flag已经改为false");
Thread.sleep(1000);
System.out.println("flag:"+threadDemo004.flag);
}
}