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

volatile keyword can't stop loop in java

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和return,你应该怎么做?

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

  2. 调用 join 等待 ReaderThread 完成。

  3. volatile关键字可以在写线程和读线程之间建立happens-before关系,可以把number = 50;放在ready = true;之前,这使得确保 reader 会注意到 number50 当它注意到 readytrue.

示例:

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