可见性–线程工作内存造成的异常情况
1.使用多线程造成的死循环情况
代码实例:
//测试可见性
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("线程被停止了!");
}
}
//测试
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();
}
}
执行结果出现了死循环情况
输出结果:
为什么会出现这种情况?怎么解决?
-
出现死循环的原因
程序陷入空循环,主要是由于isRunning变量存在于公共堆栈和线程的私有堆栈,线程运行后,一直在私有堆栈中获取变量值,而代码的"thread.setRunning(false);"更新的是公共堆栈中的值,所以程序处于死循环中。
线程私有的内存结构:
-
解决办法
使用volatile关键字,当变量使用volatile时,会直接从主内存中获取变量,从而使操作的为同一变量,程序即可正常退出。
private volatile boolean isRunning = true;
volatile操作的结构图:
总结:
- 线程间可见性是指:线程不从工作内存获取,直接从主内存获取值。
- 通过使用volatile关键字可以增加实例变量在多个线程间的可见性。