这是一个线程类。
public class Processor extends Thread {
public boolean running = true;
public void run()
{
while (running)
{
System.out.println("Hello from " + Thread.currentThread().getName());
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
这是主要的调用类
public class ProcessorInvoker {
public static void main(String[] args) {
Processor proc1= new Processor();
proc1.start(); // ---->assuming thread0
Processor proc2=new Processor();
proc2.start(); // ---->assuming thread1
proc1.running=false;
}
}
我对关键字 volatile 的理解是:当 Processor 类中的 boolean 变量不是 VOLATILE 时,该变量的值更改为“false”不会影响 thread1,因为更改为 false-->proc1.running= false 未被 thread1 看到,因此 thread1 继续运行但 thread0 停止。
当 boolean 变量变为 VOLATILE 时,我的理解是因为我将 boolean 变量的值更改为 false,然后线程 1 也会看到更改并将停止,但这不会在输出中发生。我看到相同的输出,线程 0 停止但线程 1 仍在运行。我认为两个线程都应该停止。有人可以帮忙澄清一下吗?请告诉我哪里错了。
最佳答案
您有两个 Processor
实例,所以当您执行 proc1.running=false;
时,您只会停止其中一个线程。您还需要调用 proc2.running=false;
来停止 proc2。
您的每个线程对象都有自己版本的实例变量running
。您可以将此变量设为静态,然后两者都将停止运行(假设线程运行并在某些其他代码可能将 running
更改回 true 之前达到 while 条件)。
I thought both the threads should stop
当你的消息来源说其他线程应该看到一个 volatile 变量的最新值时,他们并不意味着其他具有等效版本变量的线程(如 Thread
对象)也有他们的变了。它们意味着当其他执行线程尝试访问该变量(无论它是在 Thread
对象还是任何其他类型的对象中)时,它们将看到最新的值。
关于java - 不理解 'volatile' 关键字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25224645/