有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java不理解“volatile”关键字

这是一个线程类

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类中的布尔变量不是volatile时,将该变量的值更改为“false”不会影响thread1,因为将值更改为false-->;程序1。thread1看不到running=false,因此thread1继续运行,但thread0停止

当布尔变量变得易变时,我的理解是,因为我将布尔变量的值更改为false,那么thread1也会看到更改,并将停止,但这不会发生在输出上。我看到了相同的输出,thread0停止,但thread1仍在运行。我想两条线都应该停下来。谁能帮我澄清一下吗?请告诉我哪里错了


共 (1) 个答案

  1. # 1 楼答案

    您有两个Processor实例,因此当您执行proc1.running=false;时,您只会停止其中一个线程。您还需要调用proc2.running=false;来停止proc2

    每个线程对象都有自己版本的实例变量running。您可以将这个变量设为静态,然后两者都将停止运行(假设线程运行并达到while条件,然后其他一些代码可能会将running更改回true)

    I thought both the threads should stop

    当你的消息来源说其他线程应该看到一个易失性变量的最新值时,他们并不意味着其他线程(如Thread对象)已经更改了该变量的等效版本。这意味着,当其他执行线程尝试访问该变量时(无论是在Thread对象中还是任何其他类型的对象中),它们将看到最新的值