【Java多线程】volatile关键字
程序员文章站
2022-05-05 16:35:02
...
volatile作用:实现多线程之间变量共享,可以强制线程从主内存中读取数据
1.看代码:
public class RunThread extends Thread{
private boolean isRunning=true;
public void setRunning(boolean isRunning){
this.isRunning=isRunning;
}
@Override
public void run(){
System.out.println("进入run了");
while (isRunning==true){
}
System.out.println("线程被停止了");
}
public static void main(String[] args){
try {
RunThread thread= new RunThread();
thread.start();
Thread.sleep(1000);
thread.setRunning(false);
System.out.println("已经赋值false");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
运行结果:
线程不会停止,即线程进入了死循环
明明已经thread.setRunning(false);
为什么isRunning没有被判断为false呢?
原因:
私有堆栈的结构图
线程从自己的工作内存中读取数据,虽然主内存中的isRunning已经被改成了false,但是工作内存中的值并没有发生变化,所以,由于工作内存和主内存的数据不一致,程序进入了死循环。
2.用volatile解决死循环
volatile可以实现多线程之间变量共享,强制线程从主内存中读取数据
当变量用volatile修饰,线程就会从主内存中读取,就再不会出现数据不一致的问题
修改1中的代码
private boolean isRunning=true;
改成
volatile private boolean isRunning=true;
运行结果:
可看出,线程已经停止。