在java中,每一个线程都一个独立的工作内存,各个线程的工作内存之间相互独立、互不可见,工作内存中的变量的数据值都是事先从主内存中拷贝的,当线程执行时候,就会在工作内存中操作这些变量的值,最后当线程执行完毕,就会将这些变量的值推送给主内存。
对于volatile修饰的变量而言, 只要在任何工作内存中发生改变就会被强制刷新到主内存中去,然后其他线程的工作内存重新在主内存中获取该变量的值。
首先看下面的案例:
package com.wuk.diryRead;
public class MyThread001 extends Thread{
private boolean isRunning=true;
private void setRunning(boolean isRunning) {
this.isRunning=isRunning;
}
@Override
public void run() {
System.out.println("进入run方法。。。。");
while(isRunning) {
}
System.out.println("线程停止");
}
public static void main(String[] args) {
MyThread001 t1=new MyThread001();
t1.start();
try {
Thread.sleep(3000);
t1.setRunning(false);
System.out.println("主线程已经将isRunning设置成false了");
Thread.sleep(1000);
System.out.println(t1.isRunning);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
运行结果
进入run方法。。。。
主线程已经将isRunning设置成false了
false
当main方法已经将判断条件isRunning变量的值变成了false,但是在t1线程的工作内存中isRunning的值还是true,所以线程肯定还会一直执行下去。
当我将变量写成如下:
private volatile boolean isRunning=true;
运行结果如下:
进入run方法。。。。
主线程已经将isRunning设置成false了
线程停止
false`