java - volatile 关键字无法在 Java 中停止循环

标签 java multithreading volatile

public class VolatileOne {
    private static boolean ready ;
    private static int number ;

    private static class ReaderThread extends Thread{
        @Override
        public void run() {
            while (!ready){
                Thread.yield();
            }
            System.out.print(number);
        }
    }

    public static void main(String[] args) {
        new ReaderThread().run();
        ready = true;
        number = 50;
    }
}

运行这段代码后,程序并没有停止,这是显而易见的,因为线程将准备好的变量备份到自己进程的内存中。当我使用volatile关键字修改read时

private volatile static boolean ready ;

此时不会将读取的变量复制到进程内存中。但是程序不能停止。什么原因?跟static关键字有关系吗?

如果你想让程序输出50然后返回,你应该怎么做?

最佳答案

  1. 您需要调用start 来在另一个线程中执行代码。检查this runstart 的区别。

  2. 调用join等待ReaderThread完成。

  3. volatile 关键字可以构建一个happens-before写线程和读线程之间的关系,可以在ready = true;之前加上number = 50;,确保读者会注意到number 当它注意到 readytrue 时为 50

例子:

Thread reader = new ReaderThread();
reader.start();
number = 50;
ready = true;
reader.join();

关于java - volatile 关键字无法在 Java 中停止循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54868694/

相关文章:

java - Dagger2在常规Java项目(IDEA IntelliJ)中不会生成Component类

java - 从 Java 运行 PowerShell 文件显示该文件没有 '.ps1' 扩展名

java - 不必要的 Java 上下文切换

multithreading - 将自定义主体和身份与 WCF 服务一起使用时出现问题

python - Python 中的快速方法调用调度

Java保证回调顺序执行

java - 当我启动线程时,运行没有被调用。 java

multithreading - pthread_keycreate 中析构函数的 Win32 替代方案(当我无法控制 dllmain 时)

将 volatile 表达式的结果转换为 void

java - 正确理解 volatile、syncronized 和 AtomicReference 等概念?