package volatileTest;
public class RunThread extends Thread {
private boolean isRunning = true;
public boolean isRunning(){
return isRunning;
}
public void setRunning(boolean isRunning){
this.isRunning = isRunning;
}
@Override
public void run() {
System.out.println("进入run");
while(isRunning == true){}
System.out.println("线程被停止了");
}
}
package volatileTest;
public class Main {
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();
}
}
}
若将上述代码运行在JVM设置为Server服务器的环境中,会出现死循环的效果,System.out.println("线程被停止了");这句代码未被执行。
因为在启动 RunThread.java线程时,变量isRunning =true 存在与公共堆栈以及线程的私有堆栈中。在JVM 被设置为-server模式时为了线程运行的效率,线程一直在私有堆栈中取得isRunning 的值是 true。而代码 thread.setRunning(false)是由main线程执行的,更新的是公共堆栈中的isRunning变量值fasle,所以一直处于死循环的状态。
解决方法:就是在声明isRunning时加上关键字 volatile。
volatile private boolean isRunning = true;
加入变量volatile 关键字后,当线程访问该变量时,强制性的从公共堆栈中进行取值,而不是从自己的私有堆栈中取值。
运行结果:
进入run
已经赋值为false
线程被停止了
Volatile关键字
最新推荐文章于 2024-07-12 22:15:28 发布