不理解'volatile'关键字

时间:2014-08-10 01:17:35

标签: java multithreading 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 - > proc1.running thread1没有看到= false,因此thread1继续运行但thread0停止。

当boolean变量变为VOLATILE时我理解的是因为我将boolean变量的值更改为false然后thread1也看到了变化并且将停止但是这不会在输出处发生。我看到相同的输出, thread0停止但thread1仍在运行。我以为两个线程都应该停止。有人可以帮忙解释一下吗?请告诉我我错在哪里。

1 个答案:

答案 0 :(得分:7)

你有Processor的两个实例,所以当你执行proc1.running=false;时,你只会停止其中一个主题。您还需要调用proc2.running=false;来停止proc2。

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

  

我认为两个线程都应该停止

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