Java并发中使用无同步的奇怪行为

时间:2012-01-21 20:34:46

标签: java concurrency synchronization

Java Concurrency in Practice 中,有一个让我困惑的样本:

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 个答案:

答案 0 :(得分:7)

您不会生成新线程,而是在当前线程中运行它。请改用start()方法。

由于您run()在主线程上执行,并且该方法在无限循环中运行,因此您永远不会到达System.out.println()语句(也不会到达ready = true;)。

来自run()上的JavaDoc:

  

如果使用单独的Runnable运行对象构造此线程,则调用该Runnable对象的run方法;否则,此方法不执行任何操作并返回。

start()

  

使该线程开始执行; Java虚拟机调用此线程的run方法。