java - 不理解 'volatile' 关键字

标签 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 类中的 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/

相关文章:

java - 在 Swing 等 JavaFX 组件中使用 HTML

c# - C# 和 C++ 中的 volatile 关键字

C题: If I pass the address of a variable to a function that modifies it is there a guarantee that the variable will be "reloaded" after return?

java - 关于引用类型的 Java volatile 关键字的问题

c# - 使用线程对 C# 事件中的循环进行计数

java - 限制函数调用的时间

java - 使用递归如何保持局部变量更新

java - 如果测试失败,则重试 TestNG 代码中的特定代码段,而不是整个测试

java - Android 如何每隔 x 小时或分钟执行一个方法

python - Python3 Asyncio 创建任务时出现问题