我有以下代码:

public class Nit extends Thread {
    public void run() {
        try {
            synchronized(this) {
                this.wait();
            }
            System.out.println("AAA");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        Nit n = new Nit();
        n.start();
        synchronized(n) {
            n.notify();
        }
    }
}

当我从cmd运行它时,它永远不会像死循环那样退出。我不明白为什么。我唯一能想到的是Nit n仍在等待,但我不明白为什么?

最佳答案

您正在观察种族状况。在等待发生之前,您通知。因此,等待坐在那里,永远等待。

如果您经常调用此代码,您可能会看到它有时通过-当新线程的运行速度快于主线程时。使示例工作的一种方法:尝试在Thread.sleep(1000)之前添加对notify()的调用。或者,甚至在主线程上调用println()(在notify()可能会改变时序之前)。

除此之外:这些微妙之处是您实际上避免使用“低级”原语(例如,等待/通知)的主要原因。相反,您使用标准API必须提供的功能强大的抽象(例如队列)。

10-08 02:06