Java并发中出现奇怪的行为,未使用同步机制。

4
在《Java并发编程实践》一书中,有一个样例让我感到困惑:
public class Novisibility {
    private static boolean ready;
    private static int number;

    private static class ReaderThread implements Runnable {

        public void run() {
            while (!ready) {
                Thread.yield();
            }
            System.out.println(number);
        }
    }

    public static void main(String[] args) {
        System.out.println("0");
        new Thread(new ReaderThread()).run();
        System.out.println("1");
        number = 42;
        System.out.println("2");
        ready = true;
        System.out.println("3");
    }
}

我可以理解重新排序会导致循环永远不会中断,但我无法理解为什么“1”、“2”和“3”从未打印到控制台。有人能帮忙吗?

1个回答

7
你不需要创建一个新的线程,而是在当前线程中运行它。请使用start()方法。由于run()在主线程上执行,并且该方法在无限循环中运行,因此您永远无法到达System.out.println()语句(也不会到达ready = true;)。从run()的JavaDoc中可以看到:“如果使用单独的Runnable run对象构造了此线程,则调用该Runnable对象的run方法;否则,此方法不执行任何操作并返回。”而start()方法会导致此线程开始执行;Java虚拟机将调用此线程的run方法。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接