当标志为真时,我有一个线程正在运行,但是当我将标志更改为假时,它不会死。
public static void main(String[] args)
{
try
{
MyThread mt = new MyThread();
mt.start();
Thread.sleep(1000);
mt.setRunning(false);
System.out.println("set running false");
}
catch (InterruptedException e)
{
e.printStackTrace();
}
}
public static class MyThread extends Thread
{
private boolean isRunning = true;
public boolean isRunning()
{
return isRunning;
}
public void setRunning(boolean isRunning)
{
this.isRunning = isRunning;
}
public void run()
{
System.out.println("run");
while (isRunning == true){
}
System.out.println("run over!");
}
}
我知道将"isRunning"定义为易失性可以解决问题,但是当不是易失性时,"isRunning"应该在MyThread的某个时候不可见?
由于可见性原因。
使您的变量易失性:
volatile private boolean isRunning = true;
有关更多详细信息,请参阅易失性关键字的用途。
我知道将"isRunning"定义为易失性可以解决问题,但是 当不易失时,"isRunning"在某个时候应该不可见 我的线程?
这是isRunning
的值更改,您需要在main
线程更改时MyThread
可见。否则,它可能只是继续看到true
的缓存值。
这里有两个线程。每个线程都有一个缓存。如果不添加 volatile
,线程将从所有者缓存中读取值。所以,myThread.isRunning
是真的。通过使用volatile
,所有者线程可以强制写入内存并刷新缓存。