java中的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 ;

此时读取的变量不会被复制到进程内存中。但程序不能停止。什么原因?它与静态关键字有关吗?


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


呼啦一阵风
浏览 128回答 1
1回答

德玛西亚99

您需要调用start才能在另一个线程中执行代码。检查这个run和之间的区别start。打电话join等待ReaderThread完成。volatile关键字可以在写线程和读线程之间建立起一个happens-before关系,你可以放number = 50;before ready = true;,这样可以保证读者会注意到number是50什么时候注意到ready的true。例子:Thread reader = new ReaderThread();reader.start();number = 50;ready = true;reader.join();
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java